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

我制作了一个简单的程序来反转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 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);