scanf在第一个[C]

时间:2018-03-12 01:55:21

标签: c struct scanf

我正在尝试让用户输入我的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,我无法以这种方式工作。

2 个答案:

答案 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只会阅读%sHello的后续调用可能会失败,如果他们不这样做 期待这一点。这就是为什么最好的策略是清理 缓冲区,使用此功能:

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' ) {...}