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

如何正确使用三维数组存储与打印字符串?C语言问题求助

C语言三维数组存储字符串打印异常问题解决

问题描述

需要将n组三个不同字符串(国家名称、出发日期、返回日期)存入三维数组datosCliente[size][4][size],打印时出现以下异常:

  • 前两个字符串的首字符丢失
  • 第三个字符串完全无法显示

输入数据:

tam: 1
Destino (to): China
Fecha de salida (depart in): 23 de septiembre de 2022
Fecha de regreso (return in): 24 de noviembre de 2022

错误输出:

Cliente 1:
Destino: hina
Fecha de salida: 3 de septiembre de 2022
Fecha de regreso: 

代码问题分析

你的代码存在三个核心错误:

  1. scanf残留换行未处理:输入客户数量时用scanf("%d", &tam),会把输入后的换行符留在输入缓冲区,第一个fgets会读取这个空换行,随后的getchar()会吃掉你输入的字符串首字符,导致前两个字符串首字符丢失。
  2. fgets后多余的getchar():每个fgets执行后调用getchar(),会吃掉下一个输入的第一个字符,这也是首字符丢失的原因之一;而第三个字符串的首字符被吃掉后,后续读取逻辑混乱,导致无法显示。
  3. 打印时数组越界访问:打印时使用&datos[i][0][100],size定义为100,这个地址已经超出了当前维度的数组范围,属于非法访问,导致输出异常。

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>

const int size = 100;

void ingresoDatos(char [size][4][size], int*);
void imprimirDatos(char [size][4][size], int*);

int main(void) {
  char datosCliente[size][4][size];
  int cant;
  FILE *document;
  document = fopen("data.txt", "a");
  if(document == NULL) {
    printf("Error al abrir el archivo.\n");
  }else {
    ingresoDatos(datosCliente, &cant);
    imprimirDatos(datosCliente, &cant);
  }
  fclose(document);
  return 0;
}

void ingresoDatos(char datos[size][4][size], int *cant) {
  int tam = 0;
  system("clear");
  printf("Ingreso de datos\n");
  do {
    printf("Ingrese el número de clientes: ");
    scanf("%d", &tam);
    // 处理scanf残留的换行符
    getchar();
  }while(tam >= 100 || tam <= 0);
  *cant = tam;
  // 数组索引改为从0开始,符合C语言习惯
  for(int i = 0; i < tam; i++) {
    system("clear");
    printf("Ingrese el destino: ");
    fgets(datos[i][0], size, stdin);
    printf("Ingrese la fecha de salida: ");
    fgets(datos[i][1], size, stdin);
    printf("Ingrese la fecha regreso: ");
    fgets(datos[i][2], size, stdin);
  }
}

void imprimirDatos(char datos[size][4][size], int *cant) {
  system("clear");
  for(int i = 0; i < *cant; i++) {
    printf("Cliente %d:\n", i+1);
    // 使用正确的数组起始地址
    printf("Destino: %s", datos[i][0]);
    printf("Fecha de salida: %s", datos[i][1]);
    printf("Fecha de regreso: %s", datos[i][2]);
    printf("\n");
  }
}

修复说明

  • 在scanf读取客户数量后,添加getchar()吃掉残留的换行符,避免干扰后续fgets的读取。
  • 移除每个fgets后的getchar(),不再错误吃掉输入的首字符。
  • 打印时直接使用datos[i][0](等价于&datos[i][0][0]),访问数组的合法起始位置。
  • 将数组索引改为从0开始,符合C语言的常规编码习惯,避免索引浪费。

验证结果

输入相同测试数据后,输出恢复正常:

Cliente 1:
Destino: China
Fecha de salida: 23 de septiembre de 2022
Fecha de regreso: 24 de noviembre de 2022

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:45:39