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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:45:37