-1

char *を取得するために次のコードを作成しましたが、このコードを実行した後、finalResultのサイズが予想よりも大きくなり、一部のガベージ文字が含まれています。なぜ??どうすれば解決できますか?

//returns void
void processChar(){
            //.... more stuff here
            // init is a previous char*
            char* end = strstr(init,"</div>");
            if(end != NULL){
                    long length = strlen(init) - strlen(end);
                    if (length > 0){
                            char* finalResult = malloc(length);
                            strncat(finalResult, init,length);
                            //these lengths are different,being strlen(finalResult) > length
                            NSLog(@"%d %d",strlen(finalResult),length);
                            //... more stuff here  
                    }
            }
            return;
}
4

2 に答える 2

6

このコード:

char* finalResult = malloc(length);
strncat(finalResult, init,length);

未定義の結果が表示されます。を初期化したことがないのに、と連結しようとしfinalResultています。おそらくあなたは代わりに使うつもりでしたか?initfinalResultstrncpy()strncat()

また、finalResult十分な大きさではありません。終了\0文字も保持する必要があるため、次のように割り当てる必要があります。

char* finalResult = malloc(length + 1);

さらに、Keith Thomsonが指摘しているように、使用するときの危険性にstrncpy()注意してください。

この特定のケースでは、割り当て後に空の文字列としてstrncpy()初期化し、以前と同じように使用することで、使用を回避できます。finalResultstrncat()

char* finalResult = malloc(length + 1);
finalResult[0] = '\0';
strncat(finalResult, init, length);

もちろん、malloc()メモリ不足エラーの戻り値も確認する必要がありますが、これは質問の範囲外です。

于 2012-10-23T00:56:58.500 に答える
0

strlenの男から:

The strlen() function calculates the length of the string s, not including the terminating '\0' character.

明らかに、mallocは終了する「\0」文字にスペースを割り当てる必要があります。したがって、修正は簡単です。mallocに長さ+1バイトを割り当てます。

コードに2番目の重大な間違いがあります。Mallocは初期化されていないメモリを返しますが、strncatは既存の文字列に追加します。したがって、最初に、初期化されていないメモリ内の最初の「\ 0」を検索しますが、これは必要なものではありません。したがって、strncatは、mallocが返すものの最初のバイトが「\0」であることに効果的に依存します。代わりにstrncpyを使用します。

バグが修正されたコード:

char * end = strstr(init, "</div>");
if (end != NULL) {
    long length = strlen(init) - strlen(end);
    if (length > 0) {
        char * finalResult = malloc(length+1);
        strncpy(finalResult, init, length);
        printf("strlen(finalResult) = %ld, length = %ld\n", strlen(finalResult), length);
        free(finalResult);
    }
}
于 2012-10-23T01:20:40.650 に答える