可能重复:
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];
};
答案 0 :(得分:2)
scanf("%s",&myCust.surname);
此scanf
在输入缓冲区中留下换行符
fflush(stdin);
是标准的未定义行为,即使图书馆承诺,也不能在我的经验中可靠地工作。
printf("\nEnter customer address : ");
scanf("%[^\n]",&myCust.address);
这可以立即找到换行符。因此它不会读取任何内容,因为它首先遇到换行符。首先通过以格式
包含空格来跳过空格scanf(" %[^\n]",&myCust.address);
或者使用fgets
或getline
(如果您在POSIX系统上)阅读整行。
答案 1 :(得分:1)
标题:
尝试读取包含空格时正在跳过Scanf()
是。那不是错误。这就是scanf()
的工作原理(请阅读下次尝试使用的功能文档)。如果您想获得整行,无论其内容如何,请使用fgets()
:
char buf[1024];
fgets(buf, sizeof(buf), stdin);
答案 2 :(得分:0)
如果正在跳过scanf()命令,那通常是因为您输入了先前扫描的垃圾。
尝试在跳过的那个之前添加另一个scanf(& junk)。垃圾应该是char。