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

C语言字符串打印代码运行结果异常该如何排查修复?

C代码问题排查

你的代码存在多个语法错误和逻辑错误,以下是具体问题:

  • 重复定义变量:int i,i,i,i,j,k,p; 重复定义了4次变量i,属于语法问题,编译阶段就会抛出警告,运行时行为不可控。
  • 处理s2换行符时存在下标越界风险:if (s2[strlen(s1)-1]=='\n') 这里错误使用了s1的长度作为s2的下标,若s2的实际长度小于s1,会直接访问数组越界,属于未定义行为。
  • 使用未声明的数组变量:代码中没有声明s4数组,循环中直接对s4[j]赋值,属于非法内存访问,会触发不可预期的运行结果。
  • s3数组全程未赋值就打印:你最终输出的s3从定义后没有任何写入操作,存储的是栈空间的残留随机值,你看到的输出a就是栈中刚好残留的垃圾数据。
  • 字符串未手动补终止符:即使你后续将内容写入目标数组,循环赋值结束后没有手动添加\0作为字符串结束标记,打印时也会输出乱码。
  • 插入位置p未做合法性校验:没有判断p的取值是否在s1的合法下标范围内,输入异常值会直接导致数组越界。

以下是修正后的示例代码(假设需求是将s1从p位置开始的后半段截取到s3中):

#include <stdio.h>
#include <string.h>
#define SIZE 100 // 宏名建议大写避免和普通变量混淆

int main()
{
    char s1[SIZE], s2[SIZE], s3[SIZE];
    int i,j,p;
    
    printf("s1: ");
    fgets(s1, SIZE, stdin);
    printf("s2: ");
    fgets(s2, SIZE, stdin);
    // 处理s1的换行符
    if (s1[strlen(s1)-1] == '\n')
        s1[strlen(s1)-1] = '\0';
    // 修正:使用s2的长度判断
    if (s2[strlen(s2)-1] == '\n')
        s2[strlen(s2)-1] = '\0';
    printf("Insert position: ");
    scanf("%d", &p);
    // 校验p的合法性
    int len1 = strlen(s1);
    if (p < 0 || p > len1) {
        printf("Invalid position\n");
        return 1;
    }
    j=0;
    // 修正:写入s3而不是未定义的s4
    for (i=p; i < len1; i++)
    {
        s3[j] = s1[i];
        j++;
    }
    // 补充字符串终止符
    s3[j] = '\0';
    printf("s3: %s\n", s3); 
    return 0;
}

内容的提问来源于stack exchange,提问作者Van Le Thanh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:24:06