c - C - 使用指针和结构练习 - 获取带空格的字符串
问题描述
我正在使用结构和指针练习 C,我要求用户使用结构输入一些信息,然后使用指针对其进行修改,但是当我需要获取带空格的字符串时遇到问题。我将所有 scanfs 切换为 fgets,但输出仍然出现问题。
#include <stdio.h>
#include <stdlib.h>
#define MAXTSTR 25
int main(int argc, char **argv) {
typedef struct birthday {
int day, year;
char month[10];
} BDATE;
struct employee {
char name[MAXTSTR];
int id;
float salary;
BDATE bday;
} emp;
struct employee *ptrEmp = &emp;
printf("Enter employee name:");
fgets(emp.name, MAXTSTR, stdin );
printf("enter id number:");
scanf(" %d", &emp.id);
printf("enter salary");
scanf(" %f", &emp.salary);
printf("enter birhday:");
scanf(" %d", &emp.bday.day);
printf("enter year:");
scanf(" %d", &emp.bday.year);
printf("enter month:");
fgets(emp.bday.month, MAXTSTR, stdin);
printf("\nName: %s \nID: %d \nSalary: %.2f\n", emp.name, emp.id, emp.salary);
printf("%d %s %d", emp.bday.day, emp.bday.month, emp.bday.year);
printf("\n------------------------------------\n");
printf("Enter employee name:");
fgets(ptrEmp->name, MAXTSTR, stdin);
printf("enter id number:");
scanf(" %d", &ptrEmp->id);
printf("enter salary");
scanf(" %f", &ptrEmp->salary);
printf("enter birhday:");
scanf(" %d", &ptrEmp->bday.day);
printf("enter year:");
scanf(" %d", &ptrEmp->bday.year);
printf("enter month:");
scanf(ptrEmp->bday.month, MAXTSTR, stdin);
printf("\nName: %s \nID: %d \nSalary: %.2f\n",
ptrEmp->name, ptrEmp->id, ptrEmp->salary);
printf("%d %s %d", ptrEmp->bday.day, ptrEmp->bday.month,
ptrEmp->bday.year);
return (EXIT_SUCCESS);
}
输入和输出示例
Enter employee name:Luis Oliveira
enter id number:01
enter salary1525.25
enter birhday:05
enter year:1991
enter month:
Name: Luis Oliveira
ID: 1
Salary: 1525.25
5
1991
------------------------------------
Enter employee name:Patricia Santos
enter id number:02
enter salary16546.46
enter birhday:05
enter year:1946
enter month:Fev
Name: Patricia Santos
ID: 2
Salary: 16546.46
5
1946
我做错了什么?
预先感谢您的帮助。
解决方案
混合scanf()
并且fgets()
可能非常混乱:scanf()
将待处理的换行符留在输入流中并fgets()
读取它并立即返回,因为它已到达行尾。
您可以使用 读取月份,使用 读取scanf("%9s", emp.bday.month);
员工姓名scanf(" %14[^\n]", ptrEmp->name);
。
还要检查导致scanf()
返回与预期不同的值的无效输入1
。
修改程序:
#include <stdio.h>
#include <stdlib.h>
#define MAXTSTR 25
typedef struct birthday {
int day, year;
char month[10];
} BDATE;
struct employee {
char name[MAXTSTR];
int id;
float salary;
BDATE bday;
};
int main(int argc, char **argv) {
struct employee emp;
for (int i = 0; i < 2; i++) {
printf("Enter employee name: ");
if (scanf(" %14[^\n]", emp.name) != 1)
return EXIT_FAILURE;
printf("enter id number: ");
if (scanf(" %d", &emp.id) != 1)
return EXIT_FAILURE;
printf("enter salary: ");
if (scanf(" %f", &emp.salary) != 1)
return EXIT_FAILURE;
printf("enter birthday: ");
if (scanf(" %d", &emp.bday.day) != 1)
return EXIT_FAILURE;
printf("enter year: ");
if (scanf(" %d", &emp.bday.year) != 1)
return EXIT_FAILURE;
printf("enter month: ");
if (scanf("%9s", emp.bday.month) != 1)
return EXIT_FAILURE;
printf("\n\nName: %s\nID: %d\nSalary: %.2f\n", emp.name, emp.id, emp.salary);
printf("Birthday: %d %s %d\n", emp.bday.day, emp.bday.month, emp.bday.year);
printf("\n------------------------------------\n");
}
return EXIT_SUCCESS;
}
推荐阅读
- javascript - 如何检测麦克风权限状态
- git - 合并分支发展巨大冲突
- python - 在 Python 中写入临时 csv 文件以从中读取以进行排序,然后写入另一个文件会产生空结果
- python - 如何从两个指定信息之间的字符串中获取特定字符串
- angular - Angular 9 + CAS 身份验证 + .NET Core Web API
- authentication - GCP Endpoint 使用多重身份验证
- java - 我可以将 UDP 数据报从我的 android 设备发送到我 PC 上的服务器吗?通过 USB 连接的 Android 设备
- python - Python 将字典保存在文件中。“TypeError:列表索引必须是整数或切片,而不是 str”的问题
- r - Latex中的转置回归表
- c# - 从手动管理的 HttpClient(带有单独的 TokenUri)迁移到 IHttpClientFactory