繁体   English   中英

如何在C中使用gets()打印多个字符串(带空格)?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM