[英]How to print multiple strings(with spaces) using gets() in C?
在我的C程序中,我调用gets()两次来获取用户的输入。 第一次要求用户输入全名,第二次要求用户输入朋友全名。 但是,在第二次调用gets()时,它不会等待用户输入它只是跳过它并完成程序。 这是我的完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int main()
{
char fullname[30];
char friendsname[30];
char sentence[70]= "";
char gender;
printf("Enter your full name: ");
gets(fullname);
printf("\n");
printf("%s , Please enter your gender(m/f)? : ", fullname);
scanf("%c", &gender );
puts("\n");
if(gender =='m')
{
printf("Mr. %s , please enter your friends name:", fullname);
gets(friendsname);
puts("\n");
}
else if(gender =='f')
{
printf("Mrs. %s , please enter your friends name:", fullname);
gets(friendsname);
puts("\n");
}
strcat(sentence, "Hello Mr./Mrs. ");
strcat(sentence, friendsname );
strcat(sentence, ", " );
strcat(sentence, fullname);
strcat(sentence, " considered you as a friend. ");
puts(sentence);
return 0;
}
这是一个示例输出:
输入您的全名:Brad Pitt
布拉德皮特,请输入你的性别(月/天)? :m
布拉德皮特先生,请输入你的朋友姓名:
先生/你好先生。 ,布拉德皮特认为你是朋友。
进程返回0(0x0)执行时间:8.110 s按任意键继续。
获取(friendsname); line被完全跳过,程序由于某种原因继续。 任何人都可以解释为什么会这样吗?
看到这里我已经编辑了你的代码。我所做的改变只是因为第二次得到(朋友的名字)我扫描了一个字符(ch)。 您的代码中发生的事情是,在输入m / f之后按下返回(回车),性别被视为朋友的名字,因为获取输入并被跳过。 现在输入你后输入性别按ch语句捕获ch,之后输入的名称转到朋友名称。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int main()
{
char fullname[30];
char friendsname[30];
char sentence[70]= "";
char gender;
char ch; //ch declared edit 1
printf("Enter your full name: ");
gets(fullname);
printf("\n");
printf("%s , Please enter your gender(m/f)? : ", fullname);
scanf("%c", &gender );
puts("\n");
if(gender =='m')
{
printf("Mr. %s , please enter your friends name:", fullname);
scanf("%c",&ch); // Second Edit line to catch the enter
gets(friendsname);
puts("\n");
}
else if(gender =='f')
{
printf("Mrs. %s , please enter your friends name:", fullname);
scanf("%c",&ch); // Third Edit line to catch the enter
gets(friendsname);
puts("\n");
}
strcat(sentence, "Hello Mr./Mrs. ");
strcat(sentence, friendsname );
strcat(sentence, ", " );
strcat(sentence, fullname);
strcat(sentence, " considered you as a friend. ");
puts(sentence);
return 0;
}
回答:
我认为这是因为在调用scanf
函数之后悬挂的换行符。
我会使用像这样的getchar
函数来使用悬空换行符:
scanf("%c", &gender), getchar();
然后您的程序应按预期进行以进一步输入。
但是,最后你的程序可能会崩溃,因为sentence
字符数组只有70的长度。它不足以正确容纳你连接到它的所有字符。
将它增加到130,你应该没问题。
char sentence[130] = "";
进一步提示:
我认为不建议现在使用gets
; 至少我看到编译器发出警告(gcc)。 如果你可以使用fgets
,你应该这样做。 你可以像这样使用它。
fgets(fullname, 30, stdin);
fullname[strlen(fullname) - 1] = '\0';
它读取标准输入达到给定长度(更安全)并使用换行符结束字符串。 第二行删除换行符。
永远不会永远不会使用gets
。 它会在你的代码引入故障/安全漏洞的一个点。 它不再是标准库的一部分。 使用fgets
,只要知道如果有空间,它将尝试将尾随换行符存储到目标缓冲区。
跳过gets(friendsname)
的原因是,在scanf
调用读取性别之后,输入流中有一个尾随换行符; 在任何其他输入之前, gets
看到换行符并立即返回。
解决此问题的一种方法是让您的scanf
调用使用尾随换行而不将其分配给任何内容:
scanf(" %c%*c", &gender );
第二个转换说明符中的*
告诉scanf
读取单个字符并将其丢弃。 此外,格式字符串中的前导空白告诉scanf
跳过任何前导空格并读取第一个非空白字符。
只需在scanf后添加一行,如下所示
printf("%s , Please enter your gender(m/f)? : ", fullname); scanf("%c",&gender ); getc(stdin); puts("\\n");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.