反向字符串程序中的空字符是什么?
What is with the null character in reverse string program?
我必须编写一个简单的程序来反转字符串。我最终根据自己的理解得到了这段代码,但也得到了 google 的帮助,因为我最初无法让它工作。它运行良好并按预期输出,我理解除了 reverse[j] = '[=11=]'
语句之外的所有内容。
当我没有说明时,我一直在输出中获取符号,但我想知道这是如何工作的。谁能解释一下?
#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] = '[=10=]'; //I don't know what this statement does exactly
printf("The string reversed is:\n %s\n", reverse);
return 0;
}
[=11=]
不是真正的字符。这是 c 程序标记字符串结尾的方式。因此,如果您只想反转字符串,则不必在反转字符串的开头移动此字符。
original string: hello[=10=]
reverse string : olleh[=10=]
如果您希望字符数组包含一个字符串,那么它必须有终止零。
例如,您程序中使用的函数 strlen
计算字符数组中终止零之前的字符数。
还有函数 printf
与格式说明符 %s
一起使用,输出字符数组中的字符,直到遇到终止零。
例如,如果您有这样的数组
char s[10] = "Hello";
然后调用 strlen( s )
returns 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', '[=14=]', '[=14=]', '[=14=]', '[=14=]', '[=14=]'};
如果你需要反转存储在数组中的字符串,很明显你需要反转第一个终止零之前的字符。如果您想以相反的顺序将字符串复制到另一个字符数组,您需要在目标数组中附加终止零。
这个循环
for (i = length - 1, j= 0; i >= 0; i--, j++)
reverse[j] = original[i];
从原始字符数组中以终止零之前的最后一个字符开始,以相反的顺序复制除终止零之外的所有字符到目标字符数组。您需要使用终止零
附加目标字符数组
reverse[j] = '[=16=]';
\0 用于空终止字符串。这将标记字符串的结尾。如果不是空终止,后续位置的数据也将被错误地视为字符串的一部分。
我必须编写一个简单的程序来反转字符串。我最终根据自己的理解得到了这段代码,但也得到了 google 的帮助,因为我最初无法让它工作。它运行良好并按预期输出,我理解除了 reverse[j] = '[=11=]'
语句之外的所有内容。
当我没有说明时,我一直在输出中获取符号,但我想知道这是如何工作的。谁能解释一下?
#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] = '[=10=]'; //I don't know what this statement does exactly
printf("The string reversed is:\n %s\n", reverse);
return 0;
}
[=11=]
不是真正的字符。这是 c 程序标记字符串结尾的方式。因此,如果您只想反转字符串,则不必在反转字符串的开头移动此字符。
original string: hello[=10=]
reverse string : olleh[=10=]
如果您希望字符数组包含一个字符串,那么它必须有终止零。
例如,您程序中使用的函数 strlen
计算字符数组中终止零之前的字符数。
还有函数 printf
与格式说明符 %s
一起使用,输出字符数组中的字符,直到遇到终止零。
例如,如果您有这样的数组
char s[10] = "Hello";
然后调用 strlen( s )
returns 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', '[=14=]', '[=14=]', '[=14=]', '[=14=]', '[=14=]'};
如果你需要反转存储在数组中的字符串,很明显你需要反转第一个终止零之前的字符。如果您想以相反的顺序将字符串复制到另一个字符数组,您需要在目标数组中附加终止零。
这个循环
for (i = length - 1, j= 0; i >= 0; i--, j++)
reverse[j] = original[i];
从原始字符数组中以终止零之前的最后一个字符开始,以相反的顺序复制除终止零之外的所有字符到目标字符数组。您需要使用终止零
附加目标字符数组reverse[j] = '[=16=]';
\0 用于空终止字符串。这将标记字符串的结尾。如果不是空终止,后续位置的数据也将被错误地视为字符串的一部分。