【问题标题】:How to print multiple strings(with spaces) using gets() in C?如何在 C 中使用 gets() 打印多个字符串(带空格)?
【发布时间】:2015-08-31 07:07:48
【问题描述】:

在我的 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;


}

这是一个示例输出:


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

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

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

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

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


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

【问题讨论】:

  • 第一条建议是:不要使用gets,而是使用fgets
  • 在每个 gets 之后使用 getchar 显式读取换行符
  • 欢迎来到 SO。 gets 已从最新的 C 标准中删除,请勿使用。另外,请在此处询问时正确缩进您的代码。让我们更容易阅读。
  • gets 已从 C 语言中删除,因此您不应该使用它。

标签: c gets


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢你,约翰!,我读到了使用 gets() 时出现的尾随换行,但不确定如何解决它,所以感谢你澄清那部分。
【解决方案2】:

See Here 我已经编辑了您的代码。我所做的更改只是在第二个获取(朋友姓名)之前我扫描了一个字符(ch)。您的代码中发生的情况是,在输入 m/f 后按下的返回 (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;


}

【讨论】:

    【解决方案3】:

    答案:

    我认为这是因为在调用 scanf 函数后有一个悬空的换行符。

    我会像这样使用 getchar 函数来消耗悬空的换行符:

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

    那么您的程序应该按预期继续进行进一步的输入。

    但是,最后您的程序可能会崩溃,因为 sentence 字符数组的长度只有 70。它不足以正确容纳您连接到它的所有字符。

    将它增加到 130 应该没问题。

    char sentence[130] = "";
    

    进一步提示:

    我认为现在不建议使用gets;至少我看到了来自我的编译器(gcc)的警告。如果你可以使用fgets,你应该这样做。你可以这样使用它。

    fgets(fullname, 30, stdin);
    fullname[strlen(fullname) - 1] = '\0';
    

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

    【讨论】:

      【解决方案4】:
      • 在scanf后加一行,如下

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

      【讨论】:

        猜你喜欢
        • 2015-12-21
        • 2022-10-02
        • 1970-01-01
        • 2021-02-25
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 2016-01-24
        相关资源
        最近更新 更多