作业限制下如何用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
相关产品推荐
相关产品推荐

