我必须制作一个简单的程序来反转一个字符串。我最终得到了这个代码来自我自己的理解,但也得到谷歌的帮助,因为我原来无法让它工作。它运行正常并按原样输出,除reverse[j] = '\0'
语句外,我理解所有内容。
当我没有陈述时,我一直在输出中得到符号,但我想知道它是如何工作的。有人可以解释一下吗?
#include<stdio.h>
int main(void)
{
char original[20], reverse[20];
int length, i, j;
printf("Enter a string:\n");
gets(original);
length = strlen(original);
for (i = length - 1, j= 0; i >= 0; i--, j++)
reverse[j] = original[i];
reverse[j] = '\0'; //I don't know what this statement does exactly
printf("The string reversed is:\n %s\n", reverse);
return 0;
}
答案 0 :(得分:8)
如果你想要一个字符数组包含一个字符串,那么它必须有终止零。
例如,程序中使用的函数strlen
在终止零之前计算字符数组中的字符。
与格式说明符printf
一起使用的函数%s
也会输出字符数组中的字符,直到遇到终止零。
例如,如果您有这样的数组
char s[10] = "Hello";
然后调用strlen( s )
返回5而不是10.并调用printf(“%s \ n”,s);输出6个字符(包括换行符)。
考虑这个示范程序
#include <stdio.h>
int main(void)
{
char s[10] = "Hello";
printf( "%d\n", printf( "%s\n", s ) );
return 0;
}
它的输出是
Hello
6
此初始化
char s[10] = "Hello";
完全等同于
char s[10] = { 'H', 'e', 'l', 'l', 'o', '\0', '\0', '\0', '\0', '\0'};
如果你需要反转存储在数组中的字符串,很明显你需要在第一个终止零之前反转字符。如果您想以相反的顺序将字符串复制到另一个字符数组,则需要将目标数组附加到终止零。
此循环
for (i = length - 1, j= 0; i >= 0; i--, j++)
reverse[j] = original[i];
以相反顺序复制除终止零之外的所有字符,从原始字符数组开始,从终止零之前的最后一个字符开始到目标字符数组。您需要使用终止零
附加目标字符数组reverse[j] = '\0';
答案 1 :(得分:2)
答案 2 :(得分:2)
\0
不是真正的角色。这是c程序标记字符串结尾的方式。因此,如果您只想反转一个字符串,则不必在反向字符串的开头移动该字符。
original string: hello\0
reverse string : olleh\0
答案 3 :(得分:0)
\ 0用于null终止字符串。这将标记字符串的结尾。如果它不是空终止,则后续位置中的数据也将错误地视为字符串的一部分。