如何在 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;


}

这是一个示例输出:


输入您的全名:布拉德皮特

布拉德皮特,请输入您的性别(m/f)? : 米

先生布拉德皮特,请输入您的好友姓名:

您好先生/女士。 , 布拉德皮特把你当朋友了

进程返回 0 (0x0) 执行时间:8.110 秒 按任意键继续。


gets(friendsname); 行被完全跳过,程序由于某种原因继续运行。谁能解释为什么会这样?

看这里 我已经编辑了你的 code.The 我所做的更改只是在第二个获取(朋友姓名)之前我扫描了一个字符(ch)。您的代码中发生的事情是,它正在接受您在键入 m/f 后按的 return (Enter),因为性别被视为朋友姓名,因为获取捕获输入并被跳过。现在你在输入性别后按下的输入被 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] = '[=12=]';

它读取标准输入达到给定长度(更安全)并以换行符结束字符串。 第二行去掉换行符。

  • scanf后加一行即可,如下

    printf("%s , Please enter your gender(m/f)? : ", fullname);
    scanf("%c",&gender );
    getc(stdin);
    puts("\n");
    

永不永不永不 使用gets。它 在您的代码中引入一个 failure/security 漏洞点。它不再是标准库的一部分。请改用 fgets,请注意,如果有空间,它会尝试将尾随换行符存储到目标缓冲区。

gets(friendsname) 被跳过的原因是在 scanf 调用读取性别后,输入流中有尾随换行符; gets 在任何其他输入之前看到该换行符并立即 returns。

解决此问题的一种方法是让您的 scanf 调用使用尾随换行符而不将其分配给任何内容:

scanf(" %c%*c", &gender );

第二个转换说明符中的 * 告诉 scanf 读取单个字符并将其丢弃。此外,格式字符串中的前导空白告诉 scanf 跳过任何前导空白并读取第一个非空白字符。