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

C语言for循环中子串存入st1后无法整体打印的问题

问题根因

这个现象由两个C语言字符串的基础用法错误直接导致:

  1. 赋值下标错位
    循环内给st1赋值时直接复用了源字符串s的遍历下标i(起始值为2),要复制的7个字符(o are y)全部被写入st1[2]到st1[8]的内存位置,st1[0]和st1[1]未被主动赋值,保存的是栈内存分配时残留的随机脏值。
  2. 缺失C字符串必需的空终止符
    C语言没有原生字符串类型,所有通过%s格式符打印的字符数组,必须在有效内容末尾添加ASCII值为0的'\0'作为结束标记:printf读取字符串时会从传入的首地址开始逐字符遍历,直到碰到'\0'才会停止输出。代码复制完字符后没有添加这个结束标记,本身不符合C字符串的规范。

循环内逐字符打印正常,是因为%c格式直接输出单个字符,不依赖st1的整体内存结构,打印一个输出一个,不受上述两个问题影响。循环外整体打印无内容,是因为当前运行环境下未初始化的st1[0]刚好为0值(即'\0'),printf读取第一个字符就碰到结束标记,直接终止输出,因此看不到任何内容。如果更换编译选项、调整代码结构,st1[0]不为0时,甚至可能输出乱码。

修复方案
  • 为st1单独维护从0开始计数的赋值下标,不要直接复用源字符串的遍历下标,保证复制的字符从st1的起始位置开始存储。
  • 所有有效字符复制完成后,在最后一个有效字符的下一个位置写入'\0'作为字符串终止符。

修复后的完整代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char s[40] = "Who are you to tell me that I can not code?";
    char st1[15];
    int st1_idx = 0;

    for (int i = 2; i < 9; i++) {
        st1[st1_idx] = s[i];
        printf("%c", s[i]);
        st1_idx++;
    }
    st1[st1_idx] = '\0'; // 不可省略的空终止符
    printf("\n Now Printing the Whole at once \n");
    printf("%s", st1);
    return 0;
}

修复后运行结果符合预期:

o are y
 Now Printing the Whole at once 
o are y

内容的提问来源于stack exchange,提问作者131 Mohammad Ubaida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:33:31