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

您需要添加空终止符:

new_str[len] = '\0';

否则,最后一个字符后面有垃圾,所以字符串没有结束

于 2012-07-18T09:36:37.353 回答
9

您需要在 new_str 中添加一个空终止符,否则 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_str不是 NUL 终止的。

从 复制所有字符后str,您需要在末尾添加一个 '\0',new_str如下所示:

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