C语言for循环声明部分赋值str[i]='\0'是否错误?反转字符串遇段错误求助
问题解答
问题一:在for循环声明部分设置str[i]='\0'获取最后一个字符的i值是否错误?
是错误的,核心问题有两点:
- for循环的初始化区域用于初始化循环变量,而非直接修改数组元素。如果
i未初始化就使用str[i],会触发访问未知内存的未定义行为;就算i有初始值,直接给str[i]赋值'\0'会截断原字符串,破坏原本内容,根本无法正确定位原字符串最后一个字符的索引。 - 正确获取最后一个字符索引的方式是先遍历到字符串结束符
'\0',此时循环变量的值为字符串长度,最后一个字符的索引为该值减1:char str[] = "hello"; int i; // 遍历至字符串末尾 for (i = 0; str[i] != '\0'; i++); // 最后一个字符的索引是i-1 printf("最后一个字符:%c\n", str[i-1]);
问题二:反转字符串代码的段错误问题分析与修复
你的代码存在多处致命问题,直接引发了段错误:
- 变量
j未初始化:内层for循环直接使用nor[j]='\0',j为随机值,大概率会越界访问nor数组(数组下标仅能取0-9),触发段错误。 - 内层循环逻辑完全混乱:
- 初始化区域不应修改数组元素,而是要给
j赋合法初始值; - 循环条件
j < 10搭配j--会导致无限循环(若j初始值≥10,递减后永远满足j<10,直到j变为负数,越界访问内存); - 试图通过内层循环定位字符串末尾的逻辑不成立,反而会破坏原字符串的结束符。
- 初始化区域不应修改数组元素,而是要给
不计算字符串长度的反转字符串实现(双指针法)
无需提前计算长度,用两个指针分别指向字符串首尾,交换对应位置字符直至指针相遇:
#include <stdio.h> int main() { char nor[10], rev[10]; int start = 0, end; printf("enter: "); scanf("%s", nor); // 定位字符串末尾索引 for (end = 0; nor[end] != '\0'; end++); end--; // 此时end指向最后一个有效字符 // 从后往前复制至反转数组 int i = 0; while (end >= 0) { rev[i++] = nor[end--]; } rev[i] = '\0'; // 为反转后的字符串添加结束符 puts(rev); return 0; }
若允许修改原数组,也可直接在原数组上反转:
#include <stdio.h> int main() { char str[10]; int start = 0, end; char temp; printf("enter: "); scanf("%s", str); // 定位末尾索引 for (end = 0; str[end] != '\0'; end++); end--; // 双指针交换字符 while (start < end) { temp = str[start]; str[start] = str[end]; str[end] = temp; start++; end--; } puts(str); return 0; }
内容的提问来源于stack exchange,提问作者Sarvani
相关产品推荐
相关产品推荐

