微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

stringinput与空格

我正在尝试在基本的ubuntu gcc编译器中为基本的C类运行下面的代码

#include<stdio.h> struct emp { int emp_num,basic; char name[20],department[20]; }; struct emp read() { struct emp dat; printf("n Enter Name : n"); scanf("%s",dat.name); printf("Enter Employee no."); scanf("%d",&dat.emp_num); //printf("Enter department:"); //fgets(dat->department,20,stdin); printf("Enter basic :"); scanf("%d",&dat.basic); return dat; } void print(struct emp dat) { printf("n Name : %s",dat.name); printf("nEmployee no. : %d",dat.emp_num); //printf("Department: %s",dat.department); printf("nBasic : %dn",dat.basic); } int main() { struct emp list[10]; for (int i = 0; i < 3; i++) { printf("Enter Employee datan %d :n",i + 1); list[i] = read(); } printf("n The data entered is as:n"); for (int i = 0; i < 3; i++) { print(list[i]); } return 0; }

我想要名字接受空格。

当我input值到结构时,问题就出现了。 我能够第一次input名字,但后来的迭代甚至没有提示我input。

我已经尝试过使用fgets , scanf("%[^n]",dat.name) ,甚至gets() (我绝望),但每次都面临同样的问题。

我如何从核心转储获取系统时间?

C ++ DLL中全局variables的范围是什么?

检查另一个程序是否有打开的文件

在Linux上,命令行程序mktemp比C函数mkstemp安全吗?

如何获得在Linux(Ubuntu的)video捕捉设备(networking摄像头)列表? (C / C ++)

一个结构的输出是好的,但其余的是垃圾,人的姓氏或只是空白。

有任何想法吗?

WINAPI_FAMILY_PARTITION是做什么的?

Windows将数据包转发到C#应用程序

如何在使用C ++中的SendMessage的应用程序之间传递string

LPtoDPfunction如何工作?

在Windows核心文件调用fopen返回NULL指针

使用scanf("%s")读取字符串时,您正在读取第一个空格字符。 这样,你的字符串不能包含空格。 你可以使用fgets代替第一个换行符。

另外,为了清空输入缓冲区,你可能要使用scanf("%dn")而不是scanf("%d") 。 否则,后续的fgets将采用换行符而不要求您输入。

我建议你用一个很小的程序进行实验,该程序读取第一个整数然后是一个字符串。 你会明白我的意思,调试起来要容易得多。 如果您遇到问题,我建议您发布一个新问题。

问题在于scanf("%[^n",..和fgets不会跳过上一行读过的任何空白,尤其是在结尾处不会跳过换行符最后一行,所以如果这个换行符仍然在输入缓冲区中(当scanf("%d",.. )读取最后一行时, scanf将会失败而不读取任何内容(在name数组),而fgets将只读取换行符。

最简单的解决方法是在scanf中添加一个显式空间来跳过空格:

printf("n Enter Name : n"); scanf(" %19[^n]",dat.name);

这也会跳过行首(空白行)的任何空格,所以如果你想要一个以空格开头的名字,可能会出现问题。

注意我还添加了19的长度限制,以避免名称数组溢出 – 如果用户输入一个更长的名称,其余的将留在输入,并被读作employeee数字。 您可能想要跳过其余部分:

scanf("%*[^n]");

这将读取输入上留下的任何非换行符并将其丢弃。 你可以把它和前面的scanf结合起来,给你看起来像这样的代码

printf("n Enter Name : "); scanf(" %19[^n]%*[^n]",dat.name); printf("Enter Employee no. : "); scanf("%d%*[^n]",&dat.emp_num); printf("Enter department : "); scanf(" %19[^n]%*[^n]",dat.department); printf("Enter basic : "); scanf("%d%*[^n]",&dat.basic);

这将忽略任何人在一行上输入的虚假额外的东西,但仍然会有人在输入字母时出现问题,其中数字是预期的,或文件结束条件。 要处理这些,你需要检查scanf的返回值。

你试过的是:

scanf("%[^n]",dat.name)

在这里你忘了指定说明符。

你可以尝试使用这个:

scanf ("%[^n]%*c",dat.name);

fgets()如果你想读空格。

注意: – "%s"将读取输入,直到达到空格。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐