虽然有多种条件

时间:2017-06-02 16:03:10

标签: c conditional-statements

这是我的代码。用户输入一个字符串,如果输入是1,2或*则显示错误。问题是条件满足所有数字,其中第一个数字是1,2 amd 3 。(11,12,22 ...)。我还使用了strlen和sizeof函数来计算数字并创建一个有效的条件但是当我打印strlen时,每个数字的输出都是1。

我不明白问题是我的多重条件还是使用scanf

这是我的代码

#include < stdio.h >

int main (void)
{
    char choice;
    int i=0;
    do
    {
        scanf("%s", &choice);
        while(choice !='1' &&  choice !='2' && choice !='*' )
        {
            printf("error");
            scanf("%s",&choice);
        }

    }while (choice !='0');
    return 0;
    }

我会非常感谢任何帮助。我是编程新手,如果问题很愚蠢,请原谅我。

4 个答案:

答案 0 :(得分:1)

考虑使用fgets获取输入,然后使用sscanf进行解析。使用int choice可以区分1到11 ...

#include <stdio.h>

int main( void) {
    char input[99] = "";
    int choice = 0;

    do {
        printf ( "Enter 0 to quit\n");
        if ( fgets ( input, sizeof input, stdin)) {
            if ( 1 == sscanf ( input, "%d", &choice)) {
                if ( choice == 1 || choice == 2 || choice == 3) {
                    printf ( "error\n");
                }
                else {
                    printf ( "you entered %d\n", choice);
                }
            }
            else {
                if ( 0 == strcmp ( input, "*\n")) {
                    printf ( "error\n");
                }
                //sscanf could not parse an int
                choice = -1;
            }
        }
        else {
            break;// fgets failed
        }
    } while ( choice != 0);

    return 0;
}

答案 1 :(得分:1)

我建议您使用以下代码:

#include <stdio.h>
#include <string.h>

int main (void)
{
        char choice[201];

        do
        {
                scanf("%200s", choice);
                if (strcmp(choice, "1") == 0 ||
                                strcmp(choice, "2") == 0 ||
                                strcmp(choice, "3") == 0)
                        printf("error");
        } while (strcmp(choice, "0") != 0);

        return 0;
}

%s等待char *参数,你的&choice是正确的,但是scanf会在指向的地址写一个完整的字符串,它可以(将)包含多个char 。通过给出char变量的地址,您只为一个char提供了空间。

你不能用比较运算符比较字符串,你必须使用strcmp函数,如果它的两个参数匹配则返回0,否则返回非零。

如果我理解你的意图,就不需要两个嵌套的while循环。也不需要进行两次scanf次调用。

200 scanf格式字符串中的%200s,限制将在您提供地址的数组中写入的字符数。 此数组的大小为201,以计算额外的'\ 0'字节,终止C字符串。

要正确编写此代码,应测试scanf的返回,以检查是否已成功解析某些内容。 请参阅scanf的手册页,了解如何检查解析是否成功。

答案 2 :(得分:1)

您已将choice声明为char个对象 - 它只能存储单个字符值。如果您在输入时输入"123"之类的字符串,则只有前导'1'存储到choice,其余输入会在choice之后立即写入内存,如果你破坏任何重要的东西,可能导致运行时错误。

如果要将输入读取并存储为字符串字符,则需要将choice声明为char数组 },大小至少至少比最大输入大小多一个字符 - IOW,如果您希望最大字符串长度为3个字符,那么choice必须声明为{{1} }}

如果要将输入读取并存储为整数,则必须将选项声明为char choice[4];而不是int,并且需要使用{{ 1}}转换说明符而不是char

答案 3 :(得分:0)

以下提议的代码:

  1. 干净地编译
  2. 每个外部循环只调用一次scanf()
  3. 提示用户输入所需的内容
  4. 现在是代码:

    #include <stdio.h>  // scanf(), printf(), perror()
    #include <stdlib.h> // exit(), EXIT_FAILURE
    
    int main (void)
    {
        char choice;
    
        do
        {
            printf( "enter 0:" );
            if( 1 != scanf(" %c", &choice) )
            {
                perror( "scanf failed" );  // to stderr:
                                           // enclosed text + reason OS thinks it failed
                exit( EXIT_FAILURE );      // once failed, it will continue to fail
                                           // so exit program with error indication
            }
    
            // implied else, scanf successful
    
            // what about other user inputs?
            if(choice !='1' &&  choice !='2' && choice !='*' )
            {
                printf("error\n");         // trailing '\n'
                                           // so immediately displayed on terminal
                                           // note: should use: 'fprintf( stderr, ... )'
                                           // because error messages should 
                                           // be output to 'stderr', not 'stdout'
            }
        } while (choice !='0');
    
        return 0;
    } // end function: main