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

作业限制下如何用scanf()和gets()输入含空格的值?

问题解决:用scanf和gets输入含空格的值

首先,你的代码存在几个核心问题,逐个修正如下:

1. 结构体成员定义错误

你当前的结构体里char *name_lastname[30];是指针数组(30个char类型指针),但未给这些指针分配内存空间,直接用gets()写入会触发内存错误。必须改成字符数组:

struct person {
    char name_lastname[30];
    char job[30];
};

2. scanf输入数字后遗留的换行符问题

用scanf("%d", &number);输入数字后,按下的回车键会留下一个\n在输入缓冲区。后续的gets()会直接读取这个换行符,导致你还没输入内容就跳过了一次输入流程。

解决方法:在scanf之后用getchar()清除缓冲区的换行符:

printf("How many names will you enter? ");
scanf("%d", &number);
getchar(); // 吃掉数字输入后的换行符

3. 读取含空格的字符串(替代不安全的gets)

gets()是已被C标准废弃的不安全函数(不检查输入长度,易导致缓冲区溢出),结合作业禁止fgets()的要求,改用scanf的%[^\n]格式符读取含空格的内容,同时加上长度限制避免溢出:

// 读取姓名(最多29个字符,留1个位置存字符串结束符'\0')
scanf("%29[^\n]", people[i].name_lastname);
getchar(); // 清除姓名输入后的换行符

// 读取工作同理
scanf("%29[^\n]", people[i].job);
getchar(); // 清除工作输入后的换行符

修正后的完整代码

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

struct person {
    char name_lastname[30];
    char job[30];
};

int main()
{
    int number;
    printf("How many names will you enter? ");
    scanf("%d", &number);
    getchar(); // 清除数字输入后的换行符

    struct person *people = (struct person*) malloc(number*sizeof(struct person));
    if (people == NULL) { // 检查内存分配是否成功
        printf("Memory allocation failed\n");
        return 1;
    }
    
    for(int i = 0; i < number; i++)
    {
        printf("name and last name: ");
        scanf("%29[^\n]", people[i].name_lastname);
        getchar(); // 清除姓名输入后的换行符
    
        printf("job: ");
        scanf("%29[^\n]", people[i].job);
        getchar(); // 清除工作输入后的换行符
    }

    // 可选:测试输出验证输入结果
    printf("\nYour input:\n");
    for(int i = 0; i < number; i++)
    {
        printf("Person %d: Name - %s, Job - %s\n", i+1, people[i].name_lastname, people[i].job);
    }
    
    free(people); // 释放malloc分配的内存
    return 0;
}

关键说明

  • %29[^\n]中的29是因为数组长度为30,必须留1个字节给字符串结束符\0,防止缓冲区溢出。
  • 每次用scanf("%[^\n]")读取后,都需要用getchar()清除换行符,否则下一次输入会直接读取残留的换行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:40:22