我正在尝试让用户输入我的struct中的第一个,中间名和姓氏。第一次扫描工作正常,任何后无法工作。到目前为止,这是我的代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "contacts.h"
int main (void)
{
// Declare variables here:
struct Name names;
char yesNo;
// Display the title
printf("Contact Management System\n");
printf("-------------------------\n");
// Contact Name Input:
printf("Please enter the contact's first name: ");
scanf ("%d", &names.firstName);
printf("Do you want to enter a middle initial(s)? (y or n): ");
scanf(" %c", &yesNo);
while (yesNo == 'y' || yesNo == 'Y') {
printf("Please enter the contact's middle initial(s): ");
scanf(" %c%d", &names.middleInitial);
yesNo = 'n';
}
printf("Please enter the contact's last name: ");
scanf(" %c%d", &names.lastName);
这是我头文件中的结构
struct Name {
char firstName[31];
char middleInitial[7];
char lastName[36];
};
当我输入多个字符时程序结束,当我只输入一个字符时,程序会跳过第二个scanf。我事先有程序工作,但我意识到我需要使用结构,所以我从int转换到struct,我无法以这种方式工作。
答案 0 :(得分:1)
您使用allprojects {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
}
错误。
scanf
scanf ("%d", &names.firstName);
是一个names.firstName
数组,但您使用的char
需要一个
指向%d
的指针,您正在传递指向数组的指针。这是正确的:
int
然后你做
scanf("%30s", names.firstName);
有两个错误:您正在进行两次转换,但只传递一次 指针,你再次传递错误的指针。正确的:
scanf(" %c%d", &names.middleInitial);
同样适用于scanf("%6s", names.middleInitial);
,正确的版本
scanf(" %c%d", &names.lastName);
一般情况下,将scanf("%35s", names.lastName);
与scanf
一起使用时,您会遇到换行问题
和其他字符串保存在输入缓冲区中。这是因为%s
匹配一系列非空白字符,因此换行符(输入时为
按下 ENTER )将保留在输入缓冲区中。另一个例子是
如果用户输入两个至少由空格分隔的单词(如%s
),
Hello Word
只会阅读%s
。 Hello
的后续调用可能会失败,如果他们不这样做
期待这一点。这就是为什么最好的策略是清理
缓冲区,使用此功能:
scanf
你可以像这样使用它:
void clean_file_buffer(FILE *fp)
{
int c;
while((c = fgetc(fp)) != '\n' && c!=EOF);
}
负责处理遗留问题。
如果你想要对整条线有更多的控制权,那么你应该
使用printf("Please enter the contact's first name: ");
scanf ("%30s", names.firstName);
clean_file_buffer(stdin);
代替读取整行,然后您可以使用fgets
解析它。
答案 1 :(得分:0)
scanf("%s", names.firstName);
scanf(" %c", &yesNo);
scanf(" %s", names.middleInitial);
scanf(" %s", names.lastName);
或
scanf("%s", names.firstName);
getchar();
scanf("%c", &yesNo);
getchar();
scanf("%s", names.middleInitial);
getchar();
scanf("%s", names.lastName);
getchar();
并且当没有问题时,如果你键入超过1个字符,第一个字符将进入yesNo变量,其他字符将进入下一个输入变量(names.middleInitial)。 如果你想更仔细地检查yesNo, 输入yesNo as string。 (但是,需要缓冲区大小检查。缓冲区溢出。)
char yesNos[100];
scanf(" %s", &yesNos) ;
if ( yesNos[0]=='y' ) {...}