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

数组实现队列:插入时仅显示首字符,如何输入多字符?

问题分析与解决

你的问题核心在于数据类型不匹配以及输入方式错误:

  • 你定义的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:每次插入多字符字符串(实现完整字符串存储)

如果要存储完整的字符串,需调整数组类型并修改逻辑:

  1. 先定义字符串的最大长度:#define MAX_STRING_LENGTH 50
  2. 将队列数组改为二维字符数组:char arr_queue[MAX_SIZE][MAX_STRING_LENGTH];
  3. 修改插入部分代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:06:20