C语言for循环中子串存入st1后无法整体打印的问题
问题根因
这个现象由两个C语言字符串的基础用法错误直接导致:
- 赋值下标错位
循环内给st1赋值时直接复用了源字符串s的遍历下标i(起始值为2),要复制的7个字符(o are y)全部被写入st1[2]到st1[8]的内存位置,st1[0]和st1[1]未被主动赋值,保存的是栈内存分配时残留的随机脏值。 - 缺失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
相关产品推荐
相关产品推荐

