【发布时间】:2015-12-04 08:36:48
【问题描述】:
有人可以帮我解决我的问题吗?我对%[^\n] 有疑问。当我尝试输入错误输入时,程序会循环我写的警告,但如果我使用 %s 并输入我的字符串,则下一条语句将无法正常工作。
#pragma warning (disable:4996)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char name[30];
char number[12];
int flag, flag1, flag2, flag3;
int i;
printf("Add New Contact\n");
do {
printf("input name [1..30 char]: ");
scanf("%[^\n]", name); fflush(stdin);
if ((name[0] >= 'A' && name[0] <= 'Z') || (name[0] >= 'a' && name[0] <= 'z')) {
flag = 1;
}
else {
flag = 0;
printf("First letter of name should be an alphabet (A-Z or a-z)\n");
}
if (strlen(name) > 30) {
flag1 = 0;
printf("Length of name should be between 1 and 30 characters\n");
}
else {
flag1 = 1;
}
} while (flag == 0 || flag1 == 0);
do {
printf("Input phone number[6..12 digits]: ");
scanf("%s", number); fflush(stdin);
for (i = 0; i < strlen(number); i++) {
if (number[i] >= '0' && number[i] <= '9') {
flag2 = 1;
}
else {
flag2 = 0;
}
}
if (flag2 == 0) {
printf("Phone numbers should only contain digits (0-9)\n");
}
if (strlen(number) >= 6 && strlen(number) <= 12) {
flag3 = 1;
}
else {
flag3 = 0;
printf("Length of phone numbers should be between 6 and 12 digits\n");
}
} while (flag2 == 0 || flag3 == 0);
printf("\n");
printf("New contact successfully added!\n");
printf("Press Enter to continue...");
getchar();
getchar();
return 0;
}
【问题讨论】:
-
首先,如果你想成为标准的 C 兼容并且可移植,你不应该这样做
fflush(stdin),它在某些库中是一个扩展,但它在 C 规范中是明确未定义的行为。跨度> -
你所说的“错误输入”是什么意思?您能否展示一些示例输入以及您获得的实际(和预期)输出?请编辑您的问题以显示该信息。
-
另外,如果
strlen(name) > 30为真,那么您已经超出了数组的范围并且具有未定义的行为。数组name最多可以包含 29 个字符的字符串,外加字符串终止符。 -
最后,您可能想了解
isalpha函数。 -
试图让
scanf在空白处不中断是受虐狂。使用fgets读取所有行,然后将它们连接起来,或者使用getchar读取所有内容。