数组实现队列:插入时仅显示首字符,如何输入多字符?
问题分析与解决
你的问题核心在于数据类型不匹配以及输入方式错误:
- 你定义的
item是单个char类型变量,但却用scanf("%s", &item)读取字符串。%s会读取整个输入的字符串,而item仅1字节存储空间,只能存下字符串的第一个字符,剩余字符会溢出到内存其他区域,甚至可能导致程序崩溃。 - 当前队列数组
arr_queue是char类型数组,只能存储单个字符元素。如果想存储多字符字符串,需要将数组改为字符串数组。
修复方案
根据你的需求分两种场景处理:
场景1:每次插入单个字符(解决首字符显示问题)
如果只是想正确插入单个字符,修改输入方式,把scanf("%s", &item)换成scanf(" %c", &item)(%c前的空格用于跳过输入choice后遗留的换行符):
case 1: if (rear == MAX_SIZE) printf("\n## Queue Reached Max!!"); else { printf("\nEnter The Value to be Insert : "); scanf(" %c", &item); // 修改为%c格式,加空格跳过换行 printf("\n## Position : %d , Insert Value : %c ", rear + 1, item); arr_queue[rear++] = item; } break;
场景2:每次插入多字符字符串(实现完整字符串存储)
如果要存储完整的字符串,需调整数组类型并修改逻辑:
- 先定义字符串的最大长度:
#define MAX_STRING_LENGTH 50 - 将队列数组改为二维字符数组:
char arr_queue[MAX_SIZE][MAX_STRING_LENGTH]; - 修改插入部分代码:
case 1: if (rear == MAX_SIZE) printf("\n## Queue Reached Max!!"); else { printf("\nEnter The Value to be Insert : "); scanf("%s", arr_queue[rear]); // 直接将字符串存入队列当前rear位置 printf("\n## Position : %d , Insert Value : %s ", rear + 1, arr_queue[rear]); rear++; } break;
同时删除原有的char item变量,因为现在无需单独存储,直接写入队列数组即可。
删除操作的输出也要对应改成%s格式:
case 2: if (front == rear) printf("\n## Queue is Empty!"); else { printf("\n## Position : %d , Remove Value : %s ", front + 1, arr_queue[front]); // 调整格式符与位置编号 front++; } break;
额外注意点
scanf("%s")读取字符串时会忽略开头空白,但无法读取带空格的内容。如果需要读取含空格的字符串,建议用fgets,同时手动去除末尾换行符:fgets(arr_queue[rear], MAX_STRING_LENGTH, stdin); arr_queue[rear][strcspn(arr_queue[rear], "\n")] = '\0'; // 移除换行符- 输入
choice后,scanf("%d")会在缓冲区留下换行符,使用fgets前需用getchar()清空缓冲区。
内容的提问来源于stack exchange,提问作者031 130
相关产品推荐
相关产品推荐

