以下代码有什么问题?
#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
,问题就解决了。我仍然想知道导致问题的原因。
答案 0 :(得分:10)
您需要添加空终止符:
new_str[len] = '\0';
否则,在最后一个字符后面有垃圾,所以字符串没有结束
答案 1 :(得分:9)
您需要在new_str中添加空终止符,否则printf不知道何时停止。或者,你可以反转字符串 in situ ,就像这样。
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;
}
答案 2 :(得分:2)
字符串应该是零终止的。在scanf之后,str
是,但new_str
没有给出值,所以它仍然包含垃圾。循环之后,第一个(20?)字符已设置,但您仍需要附加\0
。
答案 3 :(得分:1)
new_str
不是NULL终止。
复制str
中的所有字符后,您需要在new_str
的末尾添加'\ 0',如下所示:
new_str[i] = '\0';