反向字符串程序中的空字符是什么?

时间:2016-06-29 11:33:07

标签: c arrays string reverse

我必须制作一个简单的程序来反转一个字符串。我最终得到了这个代码来自我自己的理解,但也得到谷歌的帮助,因为我原来无法让它工作。它运行正常并按原样输出,除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;
}

4 个答案:

答案 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)

在C中,字符串最后总是有\0。阅读whyhow

答案 2 :(得分:2)

\0不是真正的角色。这是程序标记字符串结尾的方式。因此,如果您只想反转一个字符串,则不必在反向字符串的开头移动该字符。

original string: hello\0
reverse string : olleh\0

答案 3 :(得分:0)

\ 0用于null终止字符串。这将标记字符串的结尾。如果它不是空终止,则后续位置中的数据也将错误地视为字符串的一部分。