-1

私はCを初めて使用し、部分文字列を取得できるようにする必要があるプロジェクトに取り組んでいますが、不明なプログラムを実行しようとすると、初期化とコアダンプに関するコンパイラの警告が表示されるため、問題が発生しています解決方法。

substringソース文字列、開始インデックス、終了インデックスを渡す関数があります。

以下は私の部分文字列関数です。

char *substring(char * src, int from, int to)
{
    char * dst = "\0";
    strncpy(dst, src+from, to);
    return dst;
}

以下は、関数を呼び出す方法です

char * debug = substring(rowReport[bPartyColIndex], 1, 2);

rowReport は MYSQL_ROW であり、bPartyColIndex は MYSQL_ROW から正しい列を参照するための 0 に等しい int です。

現時点では、上記の行に次のコンパイラ警告があります。

 warning: initialization makes pointer from integer without a cast

この警告を修正する方法を特定できません。

プログラムを実行しようとすると、strncpy.

4

4 に答える 4

3
char * dst = "\0";
strncpy(dst, src+from, to);

そのため、セグメンテーション違反が発生しています。での代入dst\0正しくありません! 実際には、バイトdstを格納するのに十分な大きさではありません。src + from代わりに割り当てる必要があります。

char *substring(char * src, int from, int to)
{
    size_t src_size = to + 1 - from;
    char * dst = malloc(src_size); // Assuming str + from is ok 
    if (dst != 0)
        strncpy(dst, src+from, src_size);
    return dst;
}   

この場合、解放する必要がありますdst:

char * debug = substring(rowReport[bPartyColIndex], 1, 2);
puts(debug);
free(debug);
于 2013-07-01T13:50:31.647 に答える
0

初め:

   char * dst = "\0";
   strncpy(dst, src+from, to);

文字列リテラルに書き込んでいますが、C では文字列リテラルは不変です。これにより、未定義の動作が発生します。

2番:

rowReport[bPartyColIndex]である必要がありますがchar *、タイプが異なります。

質問で型を指定しませんでしたが、機能する代わりに渡す必要がある配列rowReportであると仮定します。char&rowReport[bPartyColIndex]rowReport[bPartyColIndex]substring

于 2013-07-01T13:46:49.073 に答える