0

重複の可能性:
セグメンテーション違反を与える strtok

strtok 関数を使用して文字列を多くのトークンに分割しようとしましたが、この例ではセグメントが返されます。障害エラー。どこが間違っていますか??

#include <stdio.h>
#include <string.h>

int main(int argc, char** argv){
    int i=0;
    char * string = "HI:HOW:ARE:YOU:?", *tmp;

    while(1){
        if(i==0) tmp=strtok(string,":");
        else tmp=strtok(NULL,":");
        if(tmp==NULL) break;
        printf("%s\n",tmp);
        i++;
    }
    return 1;
}
4

1 に答える 1

3

変化する

char * string = "HI:HOW:ARE:YOU:?"

為に

char string [] = "HI:HOW:ARE:YOU:?"

char string [] を使用すると配列があり、 char * を使用するとポインターがあります。配列を宣言すると、文字列のサイズを割り当てるためのスペースが要求されます。char * string は、リテラル文字列を指すポインターを作成します。

char *string の問題は、文字列リテラルは通常読み取り専用メモリに格納され、未定義の動作を引き起こすため、ポイントを変更してはならないことです33

(詳細については、このhttps://www.securecoding.cert.org/confluence/display/seccode/STR30-C.+Do+not+attempt+to+modify+string+literalsをお読みください)

したがって、strtokを使用すると文字列の内容が変更され、小さな文字列 (トークン) に分割されるため、問題が発生します。

于 2012-11-03T11:54:23.120 に答える