2016-06-29 45 views
2

我不得不做一个简单的程序来反转一个字符串。我最终从我自己的理解中获得了这些代码,但也得到了谷歌的帮助,因为我原本无法使其工作。它运行良好,并输出它应该和我理解除了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; 
} 
+2

首先阅读C编程手册中关于字符串的章节。 – Lundin

+0

我有,但我想要一个简单的解释。我的教材没有很好解释。 –

+6

然后得到一本新书。任何没有提到C语言字符串终止的初学者级书籍都是不好的。 – Lundin

回答

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

谢谢!所以基本上它是标记字符串的结束,而不是直到数组大小结束? –

+1

@ nedst3r是的。程序中使用的函数strlen将搜索终止零并计算终止零之前的字符数。例如,如果你有一个数组char s [10] =“Hello”;那么strlen将返回5,尽管该数组有10个字符。 –

+0

@ nedst3r没有数组大小的末尾,如果你省略了终止的null并且试图打印字符串,它将继续访问连续内存,直到出现段错误 –

2

在C中,一个字符串总是具有\0末。请阅读whyhow

+1

尽管此链接可能会回答问题,但最好在此处包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/12849713) – Peter

+0

同意,今后会记住这一点。 – babon

2

\0不是一个真正的人物。这是程序标记字符串结尾的方式。所以如果你只想反转一个字符串,你不必在反转字符串开始时移动这个字符。

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

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

+1

“*这将帮助标记*“,它不仅仅是”* help *“它是”***是***“的标志。 – alk

+0

更正:)。谢谢 – Twinkle