如何在 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
跳过任何前导空白并读取第一个非空白字符。
在我的 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
跳过任何前导空白并读取第一个非空白字符。