Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 反向字符串程序中的空字符是什么?_C_Arrays_String_Reverse - Fatal编程技术网

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

C 反向字符串程序中的空字符是什么?,c,arrays,string,reverse,C,Arrays,String,Reverse,我必须制作一个简单的程序来反转字符串。我最终从自己的理解中得到了这段代码,但也得到了谷歌的帮助,因为我最初无法让它工作。它运行良好,输出正常,除了reverse[j]='\0'语句外,我完全理解它。 我一直在我的输出中得到符号,但我没有说明它,但我想知道它是如何工作的。谁能解释一下吗 #include<stdio.h> int main(void) { char original[20], reverse[20]; int length, i, j; pr

我必须制作一个简单的程序来反转字符串。我最终从自己的理解中得到了这段代码,但也得到了谷歌的帮助,因为我最初无法让它工作。它运行良好,输出正常,除了
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;
}
#包括
内部主(空)
{
原始字符[20],反面字符[20];
int长度,i,j;
printf(“输入字符串:\n”);
取得(原件);
长度=标准长度(原件);
对于(i=length-1,j=0;i>=0;i--,j++)
反向[j]=原始[i];
反向[j]='\0';//我不知道这条语句到底是做什么的
printf(“反转的字符串是:\n%s\n”,反转);
返回0;
}

在C语言中,字符串的末尾总是有一个
\0
。阅读并阅读。

这个
\0
实际上不是一个字符。这是程序标记字符串结尾的方式。因此,如果只想反转字符串,则不必在反转字符串的开头移动此字符

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

如果希望字符数组包含字符串,那么它必须具有终止零

例如,程序中使用的函数
strlen
在终止零之前对字符数组中的字符进行计数

另外,与格式说明符
%s
一起使用的函数
printf
从字符数组输出字符,直到遇到终止零为止

例如,如果您有这样一个数组

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;
}
此初始化

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';

\0表示终止字符串的null。这将标记字符串的结束。如果不是以null结尾,则后续位置中的数据也会被错误地视为字符串的一部分。

请阅读C编程书中有关字符串的章节。我已经看过了,但我想简单解释一下。我的课本解释得不好。那就买本新书吧。任何没有提到C字符串nul终止的入门级书籍都是不好的。相关:谢谢!所以它基本上是标记字符串的结尾,而不是一直到数组大小的结尾?@nedst3r是的。程序中使用的strlen函数搜索终止零并计算终止零之前的字符数。例如,如果您有一个数组char s[10]=“Hello”;然后strlen将返回5,尽管数组有10个字符。@nedst3r数组大小没有结尾,如果省略终止null并尝试打印字符串,它将继续访问顺序内存,直到出现segfaultoccur@VladfromMoscow这是一个多么聪明和有教育意义的答案——许多C语言教科书都希望有这样的解释(包括优雅地调用
printf()
作为
printf()的可选参数)
。然而,尽管对您无可争议的工作和声誉表示应有的尊重,请不要介意我问:将终止的
'\0'
字符命名为nul字符还是零字符更为合法?好吧,零字符只是
'0'
@user3078414也许可以说是终止零字符。:)“这将有助于标记”,它不仅仅是“帮助”它是“标记”。更正:)。谢谢
reverse[j] = '\0';