了解 switch 语句需要什么

问题描述 投票:0回答:3

所以我想出了一个想法来创建一个计算器来转换二进制十六进制数和十进制数,所以在短暂休息后记住如何转换我开始我的代码在 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 相同,因为我声明了它?

(请记住,我是这个平台的新手,所以我不知道如何在这里正确地写问题)

我试图在其他网站上阅读更多关于 switch 的内容,但没有找到很好的解释

c switch-statement
3个回答
0
投票
  1. char * input_user;
    是一个 指针。
    switch(x)
    需要一个整数值。
  2. 您不能从
    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` */}
/* ... */ 

你可能想从字符串的第一个字符开始切换

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
    。包含的标头定义了它。

在某些情况下(例如在嵌入式开发中),您可以在指针上使用 switch case

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

0
投票

input_user
不和
* input_user
一样吗,因为我声明的?

没有。

* input_user
仅引用分配内存的第一个
char
- 一个
char
,适合
switch
的东西。
input_user
是一个指针 - 不适合
switch
.


  • 要读取长度为 2 的字符串,代码需要一个大小为 3 的缓冲区来存储前 2 个字母和一个 空字符。不需要铸造。定义对象并一步初始化。
    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);
  • 要将用户输入扫描成字符串,请使用
    %s
    alwayswidth limit(要读取的最大字符数)。检查返回值并与预期值进行比较。
// 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");

-1
投票

在这种情况下,信息仅包含在两个字节中,可以使用宏来组合该对,既可以来自用户的输入,也可以作为适合与

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

注意菜单选项的重新格式化。不要让您的用户挣扎!

© www.soinside.com 2019 - 2024. All rights reserved.