2016-03-28 34 views
0

こんにちは私は文字列の最初の単語を削除しようとしています。 たとえば、buffer = "Hello my name is Code" removeToken()を実装した後、バッファーは"my name is Code"になります。Cの文字列の最初の単語を削除する

私が現在行っているコードは、私にセグメント違反を与えています。

私は、次があります。

char *buffer = NULL; 
char *buffercopy = NULL; 

void startBuffer(char *inputLine) { 
    int length = strlen(inputLine); 
    buffer = (char *)malloc(length); 
    buffercopy = (char *)malloc(length); 
    strcpy(buffer, inputLine); 
    strcpy(buffercopy, inputLine); 
} 

char *removeToken() { 
    /* removes the first token from the buffer, buffer is reduced in size */ 
    char *token; 
    char delimiters[2] = " ,"; 
    int origLen = strlen(buffer); 
    token = strtok(buffer, delimiters); 
    printf("%s \n", token); 
    int p = strlen(token); 
    int i = 0; 
    while (buffer[i] != '\0') { 
     buffer[i] = buffer[i + p]; 
     i++; 
    } 
    return buffer; 
} 
+0

デバッガでコードを介して自分自身をステッピング試してみました:ここ

が修正バージョンですか?あなたはsegfaultが起こっているか知っていますか? –

+0

はい! "while(buffer [i]!= ....")で始まるwhileループで発生しています。 – jobravooo

答えて

1

あなたのコード内の複数の問題があります、あなたはnull終端に1つの余分なバイトを割り当てる必要がありますが、文字列をコピーするために十分なメモリを割り当てません

は:

void startBuffer(char *inputLine) { 
    int length = strlen(inputLine); 
    buffer = (char *)malloc(length + 1); 
    buffercopy = (char *)malloc(length + 1); 
    strcpy(buffer, inputLine); 
    strcpy(buffercopy, inputLine); 
} 

上記のコードはこれに簡略化することができることに注意してください。

、あなたが区切り文字列を割り当てる:

char delimiters[2] = " ,"; 

あなたは'\0'ヌル終端する第三のバイトを必要とするので、これは正しくありません。あなたは代わりに、これを書くことができます。

char delimiters[] = " ,"; 

あなただけの最初の文字列の長さ、'\0'に変更された最初のものではないセパレータを、数えます。

したがって、コピーループはすぐに停止します。

コピーループの最後の'\0'もコピーすることを忘れないでください。

char *removeToken(char *buffer) { 
    const char *delimiters = " ,"; 
    size_t i, skip; 

    skip = strcspn(buffer, delimiters); /* skip the word */ 
    skip += strspn(buffer + skip, delimiters); /* skip the delimiters */ 

    for (i = 0; buffer[skip + i] != '\0'; i++) { 
     buffer[i] = buffer[skip + i]; 
    } 
    buffer[i] = '\0'; 

    return buffer; 
} 
+0

これは私にとってはうまくいきました!この行では、skip + = strspn(buffer + skip、デリミタ);/*デリミタをスキップする* /なぜバッファを追加してスキップするのかわからない – jobravooo

関連する問題