了解switch语句采用什么

2admgd59  于 2023-03-12  发布在  其他
关注(0)|答案(3)|浏览(156)

所以我想出了一个主意,创建一个计算器,转换二进制十六进制和十进制数字,所以经过短暂的休息,以记住如何转换我开始我的代码在c和这是我卡住了:

#include <stdio.h>
#include <stdlib.h>

#define NULL ((char *)0)

int main() {
    printf("Please choose one of the options:\n"
       "for hexadecimal to binary enter xb\n"
       "for binary to hexadecimal enter bx\n"
       "for binary to decimal enter bd\n"
       "for hexadecimal to decimal enter xd\n"
       "for decimal to binary enter db\n"
       "for decimal to hexadecimal enter dx\n");
    char * input_user;
    input_user = (char *) malloc(sizeof(char)*2);
    scanf("%s2", input_user);
    printf("%s", input_user);
    switch (input_user) {
        case xd: 
                printf("something");
                break;
        default:
               printf("nothing");
               break; 
    }
    free(input_user);
}

当我将指针传递给交换机时,它会向我发送错误
Statement requires expression of integer type ('char *' is invalid)
现在我不明白为什么当我传递input_user时,它会抛出那个错误,但是如果我传递* input_user,它会隐藏这个错误,input_user和 * input_user不一样吗?
(请记住,我是这个平台的新手,所以我不知道如何正确地在这里写问题)
我试图阅读更多关于开关在其他网站,但尚未找到一个很好的解释

x9ybnkn6

x9ybnkn61#

input_user* input_user不一样吗?因为我声明了它。
不,* input_user只引用已分配内存的第一个char-一个char,适合switchinput_user是一个指针-不适合switch

  • 要读入长度为2的字符串,代码需要大小为3的缓冲区来存储前2个字母和一个 *null字符 *。不需要强制类型转换。定义对象并在一个步骤中初始化。sizeof(char)始终为1,因此不需要sizeof(char) *。如果要记录大小,请将大小记录到引用的对象,而不是类型。为简洁起见,未显示:检查分配是否成功。
// char * input_user;
// input_user = (char *) malloc(sizeof(char)*2);
char * input_user = malloc(3);
// or
char * input_user = malloc(sizeof input_user[0] * 3);
  • 若要将用户输入扫描为字符串,请使用带有 width limit(要读取的最大字符数)的%salways。检查返回值并与预期值进行比较。
// scanf("%s2", input_user);
if (scanf("%2s", input_user) != 1) TBD_Code_to_report_error();
  • 代码无法切换字符串。请切换整数,如单个char
// First character
    switch (input_user[0]) {
        case 'x': printf(" hex"); break;
        case 'd': printf(" dec"); break;
        case 'b': printf(" bin"); break;
        default:  printf(" ???");
    }

    printf(" to");

    // Next character
    switch (input_user[1]) {
        case 'x': printf(" hex"); break;
        case 'd': printf(" dec"); break;
        case 'b': printf(" bin"); break;
        default:  printf(" ???");
    }

    printf("\n");
83qze16e

83qze16e2#

  1. char * input_user;是一个指针。switch(x)需要一个整数值。
    1.您不能从switch中的字符串中进行选择,因为==不比较字符串内容,仅比较引用(地址)。您需要使用strcmp函数来比较它们和if语句
if(!strcmp(input_user, "yes")) {/* do something for `yes` */}
else if(!strcmp(input_user, "no")) {/* do something for 'no` */}
else if(!strcmp(input_user, "maybe")) {/* do something for `maybe` */}
/* ... */

您可能希望从string的第一个字符开始切换

switch(*input_string)
{
    case 'y'
    case 'Y'
       /* do something for 'y' */
       break;
    case 'n'
    case 'N'
       /* do something for 'n' */
       break;

    /* more cases */

    default:
       /* do something for everything elese */
       break
}

1.不要自己定义NULL。包含的头文件定义了它。
在某些情况下可以在指针上使用大小写开关(例如在嵌入式开发中)

int enableClock(GPIO_TypeDef *gpio)
{
    int result = 0;
    switch((uint32_t)gpio)
    {
        case GPIOA:
            __HAL_RCC_GPIOA_CLK_ENABLE();
            break;
        case GPIOB:
            __HAL_RCC_GPIOB_CLK_ENABLE();
            break;
        case GPIOC:
            __HAL_RCC_GPIOC_CLK_ENABLE();
            break;
        /* ... */
        default:
            result = 1;
            break;
    }
    return result;
}
lpwwtiir

lpwwtiir3#

在这种情况下,信息只包含在两个字节中,可以使用宏来合并这两个字节,既可以来自用户的输入,也可以作为适合与switch/case一起使用的常量值。

#include <stdio.h>
#include <stdlib.h>

#define PAIR(x,y) ( ((x)<<8) | (y) )

int main( void ) {
    char sel[ 100 ];

    for( ;; ) {
        do {
            printf("\nPlease choose one of the options:\n"
                "xb - hexadecimal to binary\n"
                "bx - binary to hexadecimal\n"
                "bd - binary to decimal\n"
                "db - decimal to binary\n"
                "xd - hexadecimal to decimal\n"
                "dx - decimal to hexadecimal\n");

        } while( scanf( "%99s", sel ) != 1 );
        puts( sel );

        switch( PAIR( sel[0], sel[1] ) ) {
            case PAIR( 'x', 'd' ):
                puts( "hex to dec" );
                break;
            case PAIR( 'd', 'x' ):
                puts( "dec to hex" );
                break;

            /* more options */

            default:
                puts( "nonsense" );
                break; 
        }
    }

    return 0;
}

注意菜单选项的重新格式化。不要让你的用户感到困扰!

相关问题