C程序循环错误

时间:2015-03-19 04:20:12

标签: c loops

我只是一个初学者,我正在尝试使用我所知道的任何一个简单的程序:

  1. 要求用户输入字母'S'或's'。如果没有输入's',程序循环。如果用户输入“s”,则程序
  2. 要求用户输入一个数字,1或2.如果输入了错误的数字,程序将循环。
  3. 我遇到的问题是,在'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);
    }
    

3 个答案:

答案 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)

下面。我使用以下代码修复了问题。这样代码执行以下操作:

  1. 扫描字母'S'或's'。如果没有输入,则保持循环。
  2. 扫描数字1或2.继续循环,直到输入任一数字然后退出。
  3. 程序不会从一开始就循环(通过输出“输入'S'来启动程序),如果在程序的第2部分输入了1或2以外的任何数字。这是最初的问题。
  4. 以下是正确的代码:

    #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;
            }
        }
    }