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

时间:2012-12-20 21:51:18

标签: c scanf

  

可能重复:
  scanf: “%[^\n]” skips the 2nd input but “ %[^\n]” does not. why?

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

我正在尝试使用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];


};

3 个答案:

答案 0 :(得分:2)

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

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

fflush(stdin);

是标准的未定义行为,即使图书馆承诺,也不能在我的经验中可靠地工作。

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

这可以立即找到换行符。因此它不会读取任何内容,因为它首先遇到换行符。首先通过以格式

包含空格来跳过空格
scanf(" %[^\n]",&myCust.address);

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

答案 1 :(得分:1)

标题:

  

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

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

char buf[1024];
fgets(buf, sizeof(buf), stdin);

答案 2 :(得分:0)

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

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