2016-09-21 16 views
-2

文字列をスライスして、この新しいスライスされた部分をコピーしようとしています。Cで文字列をスライスしてコピーする

char* makeWord(char *c, int j, int i){ 

    char *s; 
    s = malloc(sizeof(char)*i-j) 
    int k; 
    for (k = 0; k < i - j; k++){ 
     s[k] = c[j+k]; 
    } 

    printf("%s ", s); 

    return s; 
} 

元の文字列の関連部分をコピーするポインタを返そうとしています。

最後に奇妙な記号が印刷されています。

例:

c[] = "hello darkness my old friend" 
makeWord(c, 0, 5); makeWord(c, 6,14); makeWord(c, 15, 17); makeWord(c, 18, 21); 

は生成: こんにちはdarknessmt_'3 MYP古いfriendP

を初心者の質問には申し訳ありません、ありがとうございます。

+3

何の文字列がで終わっていますか?あなたの 's'は何かが欠けています。 – user2357112

+2

'sizeof(char)'は常に1であるため、冗長です –

+1

は、より意味のある変数名を 'i'や' j'よりも使用することを検討します。 –

答えて

1

Cの有効な文字列には、ヌルターミネータが必要です。

あなたはmalloc()を1バイト追加して保存し、最後の文字の後に\0で文字列を閉じなければなりません。

+0

ありがとうございます。 –

0
  1. あなたがn文字を保持する文字列バッファを割り当てる必要がある場合は、あなたがn+1文字、終端のNULL文字、'\0'のための追加のいずれかが必要。また、自分でターミネータを設定する必要があることを忘れないでください。

  2. sizeof(char)は常に標準で定義されています。

これを試してみてください:

char* makeWord(char *c, int start, int end) { 

    char *s = malloc(end - start + 1); 
    if (!s) return NULL; 
    int k; 
    for (k = 0; k < end-start; k++){ 
     s[k] = c[start+k]; 
    } 
    s[k] = '\0'; 

    printf("%s ", s); 

    return s; 
} 
関連する問題