#include <stdio.h>
#include <stdlib.h>
int main()
{
int id = 0;
int pin = 0;
int count1 = 0;
int count2 = 0;
printf("enter student id: ");
scanf("%i",&id);
while(id !=0)
{
id /= 10;
count1++;
}
while(count1 != 7)
{
printf("the student id should be in 7 or 8 digits\n");
printf("enter student id: ");
scanf("%i",&id);
}
if(count1 = 7)
{
printf("enter student pin: ");
scanf("%i",&pin);
}
return 0;
}
如果我重新输入我的学生ID,这是7位数,我希望转到下一个声明,但它不断重复同样的问题。
我该如何解决这个问题?
答案 0 :(得分:2)
您的代码存在许多问题。
if(count1 = 7)
将值7分配给变量count1,以便使用if(count1 == 7)
进行比较。count1
,否则您将无限期地继续增加号码。例如,你可以这样做:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int id = 0;
int pin = 0;
int count1 = 0;
for(;;)
{
printf("enter student id: ");
scanf("%i",&id);
while(id !=0) {
id /= 10;
count1++;
}
if (count1 != 7 && count1 != 8) {
printf("the student id should be in 7 or 8 digits\n");
count1 = 0;
}
else break;
}
printf("enter student pin: ");
scanf("%i",&pin);
return 0;
}
答案 1 :(得分:1)
由于您有if (count1 = 7)
,7
已分配给count1
且条件被评估为真值,因为在c中任何非零条件都为真。
为防止出现这种情况,您可能需要启用编译器警告,如果它们在编译器上,则会告诉您将明确的括号添加到用作真值的赋值中。
This answer虽然它仍然跳过scanf()
的返回值,这可能会调用未定义的行为,但确实可以解决您的问题,但我已经为您提出了建议。
如果要查看扫描的位数,可以使用"%n"
说明符,如下所示
int
main(void)
{
int value;
int count;
value = 0; /* initialized in case no valid characters are scanned */
count = 0; /* initialized in case no valid characters are scanned */
if ((scanf("%d%n", &value, &count) == 1) && (count == 7))
fprintf(stderr, "ok, value is `%d'\n", value);
else
fprintf(stderr, "wrong length: %d\n", count);
return 0;
}
您只需阅读scanf()
's manual page 非常谨慎来解决这个问题,并了解如何根据scanf()
的返回值验证输入。