我只是一个初学者,我正在尝试使用我所知道的任何一个简单的程序:
我遇到的问题是,在's'成功输入并要求用户输入数字后,如果输入了错误的数字(不是1或2),程序会询问用户从头开始再次输入一个不正确的字母。程序从一开始就循环,不再起作用。有人可以帮我解决这个问题吗?
#include <stdio.h>
#include <ctype.h>
int function(int num);
int main()
{
char input,ch,temp,c[64],exit;
int i,invalid,num,index,flag,day;
invalid = 0;
num = 0;
size_t length = 0;
index = 0;
flag = 0;
do
{
puts("Enter the letter S to start the program:");
scanf("%c", &input);
while( input!='\n' && (ch=getchar())!='\n' && ch!= EOF);
{
if(isalpha(input)==0)
{
printf("Invalid input. Please input something.\n");
continue;
}
if(input == 'S' || input == 's')
{
printf("\nProgram start.");
while( sscanf(c, "%d", &num) != 1)
{
length = 0;
flag = 0;
num = 0;
printf("\nEnter 1 for Module A. Enter 2 for Module B. Enter here: ");
fgets(c, 63, stdin);
length = strlen(c);
for(index = 0; index < length; ++index)
{
if(c[index] < '0' || c[index] > '9')
{
flag = 1;
break;
}
}
if( flag)
{
printf("\nInvalid character\n");
continue;
}
if( sscanf(c, "%d", &num) != 1)
{
printf("\nNo input detected.");
continue;
}
if(num == 1)
{
printf("\nModule A Selected.\n");
return(0);
}
if(num == 2)
{
printf("\nModule B Selected.\n");
return(0);
}
}
}
else
{
printf("\nInvalid input.");
continue;
}
}
}
while(1);
}
答案 0 :(得分:1)
将scanf
变为这样。
scanf(" %c",&input);
然后在使用fgets
获取用户的输入时,它会将新行字符放入该缓冲区。所以这将导致这种情况失败。
if(c[index] < '0' || c[index] > '9')
{
flag = 1;
break;
}
所以把这个条件变成这样。
length=strlen(c)-1;// to skip the new line character
或者喜欢这个。
length=strlen(c);
if ( c[length] == '\n' )
c[length]='\0';
输出后,
Enter the letter S to start the program:
S
Program start.
Enter 1 for Module A. Enter 2 for Module B. Enter here: 1
Module A Selected.
在您的代码中进行此操作。
if(num == 1)
{
printf("\nModule A Selected.\n");
return(0);
}
else if(num == 2)
{
printf("\nModule B Selected.\n");
return(0);
}
else
{
printf("\nInvalid option\n");
c[0]='\0'; // It is for satisfy the second while loop condition.
continue;
}
答案 1 :(得分:0)
请注意循环:
while( input!='\n' && (ch=getchar())!='\n' && ch!= EOF);
最后限于分号的一行。以下代码不是循环的主体,尽管缩进试图假装它是。
另请注意,getchar()
会返回int
,而不是char
;您无法将结果可靠地分配给char
,然后对其进行EOF测试。根据平台的不同,您可能永远不会检测到EOF,或者当输入其他字符(通常是ÿ,y-umlaut,U + 00FF,带有DIAERESIS的拉丁文小写字母)时,您将误检测EOF。您必须使用int ch;
。
答案 2 :(得分:0)
下面。我使用以下代码修复了问题。这样代码执行以下操作:
以下是正确的代码:
#include <stdio.h>
#include <ctype.h>
int function();
char input,temp,c[64],ch,exit;
int i,invalid,num,index,flag,start;
start = 0;
invalid = 0;
num = 0;
size_t length = 0;
index = 0;
flag = 0;
int main()
{
do
{
puts("Enter the letter S to start the program: ");
scanf("%c", &input);
while( input!='\n' && (ch=getchar())!='\n' && ch!= EOF);
{
if(isalpha(input)==0)
{
printf("Invalid input. Please input something.\n");
continue;
}
if(input == 'S' || input == 's')
{
printf("\nProgram start.");
start = 1;
if(start == 1)
{
function();
return(0);
}
}
else
{
printf("\nInvalid input.");
continue;
}
}
}
while(1);
}
int function()
{
while( sscanf(c, "%d", &num) != 1)
{
length = 0;
flag = 0;
num = 0;
printf("\nEnter 1 for Module A. Enter 2 for Module B. Enter here: ");
fgets(c, 63, stdin);
length = strlen(c);
length --;
for(index = 0; index < length; ++index)
{
if(c[index] < '0' || c[index] > '9')
{
flag = 1;
break;
}
}
if( flag)
{
printf("\nInvalid character\n");
continue;
}
if( sscanf(c, "%d", &num) != 1)
{
printf("\nNo input detected.");
continue;
}
if(num == 1)
{
printf("\nModule A Selected.\n");
return(0);
}
else if(num == 2)
{
printf("\nModule B Selected.\n");
return(0);
}
else
{
printf("\nInvalid option\n");
c[0]='\0'; // It is for satisfy the second while loop condition.
continue;
}
}
}