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

C语言程序仅打印最后输入的专辑名问题求助

问题分析与解决方案

我来帮你排查代码里的问题,你的程序之所以重复打印最后一个专辑名,再加上还有其他潜在的错误,主要是以下几个原因:

1. 变量声明顺序错误,数组使用未初始化的变量

你在声明int x, numeroCanciones[x];和char nombreDiscos[30][x];的时候,x还没有被赋值!虽然C99支持变长数组(VLA),但必须在数组声明前先给x赋值,否则x的值是未定义的,会导致数组大小随机,进而引发内存访问错误或者数据覆盖——这也是你看到重复打印最后一个专辑名的核心原因之一。

2. 歌手姓名的变量类型错误

char nombreCantante;是单个字符类型,根本存不了完整的歌手姓名,你需要把它改成字符数组,比如char nombreCantante[50];(50是足够存储大多数姓名的长度)。

3. scanf读取x时的格式错误

scanf("%d\n",&x );里的\n是多余的,它会让scanf在读取完数字后,继续等待输入一个换行/空白字符才会结束,这会导致后续的专辑名输入逻辑混乱。

4. 专辑名字符数组的维度顺序错误

char nombreDiscos[30][x];的维度搞反了,应该是char nombreDiscos[x][30];——第一个维度是专辑的数量(x个),第二个维度是每个专辑名的最大长度(30字符),这样每个专辑名都有独立的存储空间,不会出现覆盖。

5. 读取专辑名前未处理残留的换行符

在使用scanf("%d", &x)读取专辑数量后,输入缓冲区里会留下一个换行符,后续的scanf("%[^\n]%*c", nombreDiscos[i])会先读取这个换行符,导致第一个专辑名被读成空字符串,后续的输入也会错位。


修正后的完整代码

#include <stdio.h>

int main() {
    // 先声明基础变量,数组等x确定后再定义
    int edadCantante;
    int x;

    printf("Introduzca el nombre del artista: ");
    // 用字符数组存储歌手姓名,长度设为50足够使用
    char nombreCantante[50];
    scanf(" %[^\n]", nombreCantante);

    printf("Introduzca edad del artista: ");
    scanf("%d", &edadCantante);

    printf("Introduzca número de discos: ");
    // 去掉多余的\n,正常读取整数
    scanf("%d", &x);

    // 现在x已经有值了,定义变长数组
    int numeroCanciones[x];
    // 维度正确:x个专辑,每个名字最多30字符
    char nombreDiscos[x][30];

    // 处理读取x后残留的换行符,避免影响后续输入
    getchar();

    // 输入每张专辑的名称
    for(int i = 0; i < x; ++i) {
        printf("Introduzca el nombre del disco %d: ", i+1);
        scanf("%[^\n]%*c", nombreDiscos[i]);
    }

    printf("\nDesplegando albumes:\n");
    for(int i = 0; i < x; ++i) {
        printf("- %s\n", nombreDiscos[i]);
    }

    printf("\nNúmero de canciones por album respectivamente:\n");
    for(int i = 0; i < x; ++i) {
        printf("Introduzca el número de canciones para %s: ", nombreDiscos[i]);
        scanf("%d", &numeroCanciones[i]);
    }

    printf("\nDesplegando número de canciones:\n");
    for(int i = 0; i < x; ++i) {
        printf("Número de canciones en album %d (%s) = %d\n", i+1, nombreDiscos[i], numeroCanciones[i]);
    }

    return 0;
}

额外说明

  • 我给代码增加了一些提示输入的信息,让交互更友好,你可以根据需要调整。
  • 如果你的编译器不支持C99的变长数组(比如某些老版本的MSVC),可以把数组的大小设为一个固定的最大值,比如#define MAX_DISCOS 20,然后用char nombreDiscos[MAX_DISCOS][30];和int numeroCanciones[MAX_DISCOS];,同时在读取x的时候加一个判断,确保x不超过这个最大值。

内容的提问来源于stack exchange,提问作者Tejon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:22:53