C语言字符串操作与转换:输入及snprintf串接异常问题求助
字符串/整数转换与输入串接问题的解决
我在编程练习中需要处理两种输入场景:接收两个整数并转为字符串,或者接收两个字符串并转为整数。但遇到了相同的串接问题:输入两个字符串时内容莫名串接;用snprintf将整数转字符串时也出现串接情况。
场景1:输入字符串时的串接问题
代码示例:
#include <stdio.h> int main(){ char n[5],m[5]; scanf("%s %s",n,m); printf("%s %s\n",n,m); }
输入12345 56789,输出为1234556789 12346;将n改为n[1]时,输出变成156789 56789。
场景2:snprintf转字符串时的串接问题
代码示例:
#include <stdio.h> #include <stdlib.h> int main(){ int g,w,cnt=0; scanf("%d %d",&g,&w); char n[5], m[5]; snprintf(n,6,"%d",g); snprintf(m,6,"%d",w); printf("%s\n",n); printf("%s\n",m); }
输入12345 67894,输出为1234567894 67894。
问题根源
C语言中字符串以**空字符\0**作为结束标志,你的数组长度不足以容纳输入内容加结束符,导致内存越界,破坏了相邻变量的内存空间,进而出现串接或乱码:
- 场景1中,
n[5]最多只能存4个字符+1个\0,输入12345是5个字符,超出数组长度后\0无法写入,scanf会继续往相邻的m数组内存写数据,导致两个数组内容连在一起。 - 场景2中,
n[5]存不下12345(需要5个字符+1个\0共6字节),snprintf写入时越界,覆盖了m的内存,最终输出时n会一直读到m的\0,形成串接。
解决方法
- 扩大数组长度:确保数组能容纳最大可能的输入内容加结束符。比如存储5位数字的字符串,数组长度至少设为6(5位字符+1个
\0)。
修正后的场景1代码:
修正后的场景2代码:#include <stdio.h> int main(){ // 6个元素:5位字符 + 1个结束符 char n[6],m[6]; // 限制输入长度,避免越界 scanf("%5s %5s",n,m); printf("%s %s\n",n,m); }#include <stdio.h> #include <stdlib.h> int main(){ int g,w,cnt=0; scanf("%d %d",&g,&w); // 足够容纳5位数字+结束符 char n[6], m[6]; snprintf(n,sizeof(n),"%d",g); snprintf(m,sizeof(m),"%d",w); printf("%s\n",n); printf("%s\n",m); } - 输入时限制长度:使用
scanf的格式控制符限制输入字符数,比如%5s表示最多读5个字符,避免超出数组容量。 - 用
sizeof代替硬编码长度:snprintf中用sizeof(n)代替固定数字,后续修改数组长度时无需手动调整参数。
内容的提问来源于stack exchange,提问作者stup
相关产品推荐
相关产品推荐

