-1

可能重复:
scanf:“%[^\n]”跳过第二个输入,但“%[^\n]”没有。为什么?

基本上我有一个客户结构,我要在其中输入客户详细信息,其中之一是地址。当然地址是一个句子,因为这是一个没有图形的基本文本程序。

我正在尝试使用scanf("%[^\n]",&VARIABLE)方法,因为它在以前的程序中有效。但是在这里,输入被跳过。我尝试在接受此输入之前刷新缓冲区,但没有任何区别。我还尝试创建另一个字符串并将我的输入传递给它,然后将数据复制到我的结构中,但这也不起作用。

这是我的代码 - 问题发生在第 4 次scanf("%[^\n]",&myCust.address):(注意:这是一项正在进行的工作,所以你现在可能会看到一些额外的打印和东西)

void addNewCustomer()
{
    struct customer myCust;
    printf("\n\nNEW CUSTOMER ADDITION\n");
    printf("\nEnter customer id : ");
    scanf("%s",&myCust.idNumber);
    printf("\nEnter customer name : ");
    scanf("%s",&myCust.name);
    printf("\nEnter customer surname : ");
    scanf("%s",&myCust.surname);
    fflush(stdin);
    printf("\nEnter customer address : ");
    scanf("%[^\n]",&myCust.address);
    printf("\nEnter customer telephone : ");
    scanf("%s",&myCust.telephone);
    printf("\nEnter customer mobile : ");
    scanf("%s",&myCust.mobile);
    printf("\nEnter customer e-mail : ");
    scanf("%s",&myCust.email);

    FILE *fp;

    fp = fopen("/Users/alexeidebono/Dropbox/Customer_Application/customers.dat","a");
    if (fp == NULL) {
        printf("The File Could Not Be Opened.\n");
        exit(0);
    }
    else{
        printf("File Successfully Open\n");
   fprintf(fp,"%s*%s*%s*%s*%s*%s*%s#\n",myCust.idNumber,myCust.name,myCust.surname,myCust.address,myCust.telephone,myCust.mobile,myCust.email);
    fclose(fp);
    printf("Writing successfully completed and the file is closed!!\n");
   }
}

如果你想要我的结构代码在这里(虽然我不认为结构本身是这个问题的原因)

struct customer
{
    char idNumber[11]; 
    char name[11];
    char surname[15];
    char address[30];
    char telephone[14];
    char mobile[14];
    char email[21];


};
4

3 回答 3

2
scanf("%s",&myCust.surname);

scanf会在输入缓冲区中留下一个换行符

fflush(stdin);

是标准未定义的行为,根据我的经验,即使库承诺它也不能可靠地工作。

printf("\nEnter customer address : ");
scanf("%[^\n]",&myCust.address);

这会立即找到换行符。所以它不会读入任何内容,因为它首先遇到换行符。通过在格式中包含空格使其首先跳过空格,

scanf(" %[^\n]",&myCust.address);

或使用fgetsgetline(如果您在 POSIX 系统上)读取整行。

于 2012-12-20T21:53:24.690 回答
1

标题:

尝试读取包含空格时跳过 Scanf()

是的。那不是错误。这就是scanf()工作原理(请阅读您下次尝试使用的函数的文档)。如果您想获得一整行,无论其内容如何,​​请使用fgets()

char buf[1024];
fgets(buf, sizeof(buf), stdin);
于 2012-12-20T21:53:21.620 回答
0

如果跳过了 scanf() 命令,那通常是因为您输入了以前扫描的垃圾。

尝试在跳过的之前添加另一个 scanf(&junk) 。垃圾应该是char。

于 2012-12-20T21:54:49.627 回答