C:可以反转字符数组,但不能反转字符串
我制作了一个简单的程序来反转C中的字符串。下面是我的代码:C:可以反转字符数组,但不能反转字符串,c,arrays,string,char,C,Arrays,String,Char,我制作了一个简单的程序来反转C中的字符串。下面是我的代码: #include <stdio.h> int main(){ char istring[] = {'f','o','o','b','a','r'}; char revstring[sizeof(istring)]; for(int i = 0; i < sizeof(istring); i++){ int cp
#include <stdio.h>
int main(){
char istring[] = {'f','o','o','b','a','r'};
char revstring[sizeof(istring)];
for(int i = 0; i < sizeof(istring); i++){
int cplace = sizeof(istring)-i-1;
revstring[cplace] = istring[i];
}
printf("%s",revstring);
return 0;
}
#包括
int main(){
字符字符串[]={f',o',o',b',a',r'};
char revstring[sizeof(istring)];
对于(int i=0;i
我的结果是,正如预期的那样,raboof
现在,如果我交换字符[]={f',o',o',b',a',r'}代码>,带有字符字符串[]=“foobar”代码>,我没有得到任何输出。怎么了
提前谢谢
(如果这是一个全新的问题,很抱歉)在C语言中,字符串是以null结尾的字符数组。在原始程序中,istring
不是字符串,而是一个字符数组,末尾没有空字节
成功反转字符时,revstring
不是字符串,因为末尾没有终止的空字节。因此,当您尝试使用printf
的%s
格式说明符将其打印为字符串时,它将搜索数组的末尾。读取超出数组边界的内容是错误的
未定义行为的表现方式之一是程序看起来工作正常。在你的情况下,你得到了“幸运”,并得到了预期的结果
当您将istring
定义为istring[]=“foobar”代码>使用包含空终止字节的字符串常量初始化它。所以这个定义实际上比前一个大一个字节
当您反转字符时,实际上包含了空字节。因此,生成的数组首先包含空字节,然后是其他字符。然后,当您打印它时,首先会看到空字节,因此您拥有的是一个空字符串
在循环中,使用strlen(istring)
而不是sizeof(istring)
作为上限。然后在末尾添加空字节
char istring[] = "foobar";
char revstring[sizeof(istring)];
for(int i = 0; i < strlen(istring); i++){
int cplace = strlen(istring)-i-1;
revstring[cplace] = istring[i];
}
revstring[strlen(istring)] = '\0';
“foobar”的大小是7,而不是6。C字符串以'\0'
字符NUL结尾
第一个示例之所以有效,是因为您无法NUL终止字符串,因此'r'
和'f'
交换失败。您可能幸运的是,反向字符串后面的地址空间计算结果为零(等于'\0'
),从而终止字符串。否则,打印未终止的字符串将调用未定义的行为
使用“foobar”
,将交换'f'
和'\0'
,生成的C字符串的长度实际上为零
通过使用获取字符串的长度来解决此问题,而不是获取内存块长度的sizeof
。您需要包括string.h
标题
char str[] = "foobar";
size_t str_len = strlen(str);
char rev[str_len + 1];
rev[str_len] = '\0';
for (int i = 0; i < str_len; i++)
rev[i] = str[str_len - i - 1];
printf("%s\n", rev);
charstr[]=“foobar”;
尺寸长度=strlen(strlen);
字符版本[str_len+1];
rev[str_len]='\0';
对于(int i=0;i
char str[] = "foobar";
size_t str_len = strlen(str);
char rev[str_len + 1];
rev[str_len] = '\0';
for (int i = 0; i < str_len; i++)
rev[i] = str[str_len - i - 1];
printf("%s\n", rev);