2016-09-03 17 views
-1

文字列の一部を別の文字列にコピーする際に問題があります。これら二つのcharのポインタを考える:私はstrncpyを中にセグメンテーションフォールトを取得文字列の一部を別の文字列にコピーする

char* findUsername(char* line, char* username){ 
    char* ptr = strstr(line, ":"); 
    ptrdiff_t index = ptr - line; 
    strncpy(username, line, index); 

    return username; 
} 

line points at string cointaining: "helmutDownforce:1234:44:yes" 
username points at: NULL 

は、ここで入力としてこれらのポインタを取る私の機能です。どうして?私が望む結果は、helmutDownforceを含む文字列へのポインタを返す関数です。

+1

'NULL'ポインタを' strncpy() 'に渡していますか? – EOF

+1

デバッグヘルプ(「なぜこのコードは動作しませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:最小、完全、および検証可能な例を作成する方法。 – Olaf

+0

'findUsername()'に呼び出しコードをポストします。 – chux

答えて

1

strncpymanualによると:

the destination string dest must be large enough to receive the copy 

ですから、strncpyを呼び出す前にusernameためmallocで最初のいくつかのメモリを割り当てる必要があります。

2

この関数は新しい文字列を割り当てて返します。したがって、メモリリークを避けるために、呼び出し関数は最終的に解放する必要があります。行にセパレータコロンがない場合は、NULLを返します。

char* findUsername(char* line){ 
    char* ptr = strchr(line, ':'); 
    /* check to make sure colon is there */ 
    if (ptr == NULL) { 
     return NULL; 
    } 

    int length = ptr - line; 
    char *username = malloc(length+1); 

    /* make sure allocation succeeded */ 
    if (username == NULL) return NULL; 

    memcpy(username, line, length); 
    username[length] = '\0'; 
    return username; 
} 
+0

好奇心:OPの 'ptrdiff_t'や' size_t'の代わりに 'int length = ptr-line;'に 'int '型を使うのはなぜですか(' malloc() 'で受け取った型ですか? – chux

関連する問題