3

次のコードの問題は何ですか?

#define N 30
int main() {
    char str[N], new_str[N];
    int i,len;
    printf("Please enter 20 letters. \n");
    scanf("%s", str);
    len = strlen(str);
    printf("The length of str is  %d ", len);
    for (i=0; i< len; i++)
        new_str[i]=str[len-1-i];
    printf("The result is: %s\n", new_str);
    return 1;
}

16文字未満のすべての文字列について、プログラムに問題がないことを確認しました。その上では、最後に未定義の文字が返されます。

  Please enter 20 letters.
  1234567891111111

  The result is: 1111111987654321q=V?.

ただし、str, new_str「」で初期化すると問題は解決します。私はまだ何が問題を引き起こしているのだろうかと思います。

4

4 に答える 4

10

nullターミネータを追加する必要があります。

new_str[len] = '\0';

そうしないと、最後の文字の後にゴミがあるため、文字列は終了しません

于 2012-07-18T09:36:37.353 に答える
9

new_strにnullターミネータを追加する必要があります。そうしないと、printfはいつ停止するかわかりません。または、このように、その場で文字列を逆にすることもできます。

char s[] = "StackOverflow";
size_t l = strlen(s);
int i, j, k;
k = l/2;
// Work with half the length
for (i=0; i<k; i++) {
  // swap the two bytes
  j=s[i];
  s[i]=s[l-1-i];
  s[l-1-i]=j;
}
于 2012-07-18T09:39:37.710 に答える
2

文字列はゼロで終了する必要があります。scanfの後、strはですがnew_str、値が指定されていないため、まだガベージが含まれています。ループの後、最初の(20?)文字が設定されていますが、それでも。を追加する必要があります\0

于 2012-07-18T09:38:13.857 に答える
1

new_strNULで終了しません。

からすべての文字をコピーした後、次のようstrに末尾に「\0」を追加する必要があります。new_str

new_str[i] = '\0';
于 2012-07-18T09:39:04.073 に答える