You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]);
    

问题二:反转字符串代码的段错误问题分析与修复

你的代码存在多处致命问题,直接引发了段错误:

  1. 变量j未初始化:内层for循环直接使用nor[j]='\0',j为随机值,大概率会越界访问nor数组(数组下标仅能取0-9),触发段错误。
  2. 内层循环逻辑完全混乱:
    • 初始化区域不应修改数组元素,而是要给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:07:08