2016-03-28 4 views
4

編集:メモリ割り当て宣言を削除し、strlen(bufferPointer)をstrlen(inputLine)に変更しました。これは私の出力の奇妙なシンボルを取り除くように思われる。charポインタを返そうとしたときに奇妙な出力が発生しました

文字列の最初の単語を削除し、削除された単語のcharポインタを返すメソッドを作成しようとしています。この単語は削除されるため、文字列のサイズを小さくする必要があります。

私は奇妙な出力に遭遇していますが、私はなぜそれがわかりません。

私はかなり新しくて、ちょうどポインタのアイデアに慣れ始めているので、助けてくれれば助かります!

//global variables 
char inputLine[] = "Hello there, my name is bob"; 
char *bufferPointer = inputLine; 
char *nextWord(); 

main(){ 
    printf("%s\n", nextWord()); 
} 

char *nextWord(){ 
    //calling a method that returns the number of words bufferPointer holds 
    int numOfWords = nwords(bufferPointer); 
    char *tmp2; 

    //Allocate memory to newArray 
    char *newArray = malloc(sizeof(char)*strlen(bufferPointer)); 

    //create backup array 
    char backup[strlen(bufferPointer)]; 
    strncpy(backup, bufferPointer, strlen(bufferPointer)); 
    backup[strlen(bufferPointer)] = '\0'; 

    //assign newArray pointer to backup array 
    newArray = backup; 

    //allocate memory to token (returned variable) 
    char *token = malloc(sizeof(char)*strlen(bufferPointer)); 
    token = strtok(newArray, " "); 

    char *tmp = strchr(bufferPointer, ' '); 
    //move pointer to next word 
    if (tmp != NULL){ 
     tmp2 = tmp; 
     bufferPointer = tmp +1; 
    } 
    return token; 
} 

旧出力は次のようになります。

there, 
my 
?²p 
?? 
?²p? 
?²p? 

新しい出力は次のようになります。

there, 
my 
name 
is 
bob 
+0

'nextToken()'はどこに定義されていますか? –

+1

'nextWord'、' nextToken' ??どちらですか? –

+0

申し訳ありませんが、私は次の単語を意味しました。私はコードを編集しました。 – Shx

答えて

2

strlen()だけあなたの文字の数、ヌル文字除くを与えます。また、ヌル文字のためにメモリを割り当てる必要があります。

+1

malloc(sizeof(char)* strlen(bufferPointer))に+1を追加しました。どうもありがとう! – Shx

+0

@Shx:あなた自身を助け、 'strlen(bufferPointer)'を複数の連続した行に使わないでください。 'int L = strlen(bufferPointer);'を使い、代わりに 'L'を使います。あなたのコードは読みやすさの向上をもたらします。また、 'sizeof(char)= 1'が永遠に定義されていると思います。 – ikrabbe

+0

@ikrabbe C99、セクション6.5.3。4: "char型、unsigned char型、signed char型(または修飾型)のオペランドに適用すると、結果は1になります。" – Kupiakos

0

トークンを返送しています。代わりに、bufferPointerを返すことになっています。

return bufferPointer. 

あなたのコードにはいくつかのメモリリークがあります。

あなたの要望には、以下の点があります。

上記のプログラムでのメモリリークが以下に強調表示されています。

//Allocate memory to newArray 
char *newArray = malloc(sizeof(char)*strlen(bufferPointer)); 
// A memory address is given to newArray here which is 
// over-written in following statement. So the above allocated 
// memeory is a leak. 
newArray = backup; 

//allocate memory to token (returned variable) 
char *token = malloc(sizeof(char)*strlen(bufferPointer)); 
token = strtok(newArray, " "); 
//There is no need to allocate memory to hold an address of a string. 
// only a character pointer is enough. So, the above allocated memory 
// is again a leak. 

さらに、必要でない2つの追加変数が定義されています。文字配列の名前はまた、あなたがどこにもまったくnumOfWordsを使用していないC.

でポインタ

2)であることから

1)変数bufferPointerinputLineに置き換えることができます。

+0

削除された単一の単語を返したいので、私はトークンを返しています。 bufferpointerは文字列全体から削除された単語を引いたものを返します。あなたのコメントを誤解した場合は、私に知らせてください。 メモリリークが発生する可能性のある一般的な領域を指摘して、見てデバッグしようとすると本当に感謝します。 – Shx

関連する問題