如何正确使用三维数组存储与打印字符串?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:
代码问题分析
你的代码存在三个核心错误:
scanf残留换行未处理:输入客户数量时用scanf("%d", &tam),会把输入后的换行符留在输入缓冲区,第一个fgets会读取这个空换行,随后的getchar()会吃掉你输入的字符串首字符,导致前两个字符串首字符丢失。fgets后多余的getchar():每个fgets执行后调用getchar(),会吃掉下一个输入的第一个字符,这也是首字符丢失的原因之一;而第三个字符串的首字符被吃掉后,后续读取逻辑混乱,导致无法显示。- 打印时数组越界访问:打印时使用
&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
相关产品推荐
相关产品推荐

