ISBN去短横程序输出重复两次,求问题原因解析
问题原因与修复方案
直接导致输出重复的核心问题
你定义的arrayClean[12]仅拷贝了12个字符,但未添加字符串终止符'\0'。C语言中printf("%s")输出字符串时,会从起始地址开始逐字节读取,直到遇到'\0'才停止。由于arrayClean在栈内存中紧邻ISBN数组,当它没有终止符时,printf会继续输出后续ISBN数组里的内容(此时ISBN已经是去横后的字符串),最终导致结果重复。
其他潜在问题
- 变量
k未初始化:k在使用前未赋值,会触发未定义行为。 - ISBN处理逻辑冗余且易越界:每次遇到短横就整体前移数组并重置
i=0重新遍历,效率极低;且j<=13时访问ISBN[j+1],虽未超出数组边界,但逻辑没必要。 scanf参数错误:scanf("%s",&ISBN)中&ISBN是多余的,ISBN本身就是指向数组首元素的指针,应改为scanf("%s", ISBN)。- 硬编码ASCII值可读性差:用
a == -3判断短横,不如直接写ISBN[i] == '-'直观,容易出错。
修复后的代码
#include <stdio.h> #include <string.h> int main(void) { char ISBN[16], arrayClean[14]; // 去横后最多13位,预留1位存终止符 int i = 0, j = 0; printf("Enter your ISBN: "); scanf("%s", ISBN); // 一次遍历完成去横操作 while (ISBN[i] != '\0') { if (ISBN[i] != '-') { arrayClean[j++] = ISBN[i]; } i++; } arrayClean[j] = '\0'; // 手动添加字符串终止符 printf("%s\n", arrayClean); return 0; }
修复说明
- 给
arrayClean分配足够空间,填充完成后手动添加'\0',确保printf能正确识别字符串结束位置。 - 简化处理逻辑:一次遍历完成去横,无需反复重置循环,效率更高且逻辑清晰。
- 移除未用到的头文件,优化代码结构。
- 直接用
ISBN[i] == '-'判断短横,提升代码可读性。
内容的提问来源于stack exchange,提问作者Jacob Carr-Simms
相关产品推荐
相关产品推荐

