C 将 const char * 转换为 char

C convert const char * to char

我搜索了很长时间才找到答案,但我只能找到 C++,似乎对 C 不起作用。我正在尝试将 const char * 的参数转换为 char 以在我的 switch 语句中使用。我尝试了各种方法,例如 strdup(),但没有成功。

#include <stdio.h>

int main(int argc, const char *argv[]) {

    char argOne = argv[1];
    char argTwo = argv[2];

    switch(argOne) {
        case '1234' :
            printf("1234!\n" );
            break;
        default :
        printf("Invalid\n" );
    }
}

编译时:

warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'const char *' [-Wint-conversion]

char argOne = argv[1];
     ^        ~~~~~~~

warning: overflow converting case value to switch condition type (825373492 to 52) [-Wswitch]

case '1234' :
     ^

在您的代码中,

  • 第 1 点:

     char argOne = argv[1];
    

    大错特错。您不能将 const char *(指针)指向 char 变量。

  • 第 2 点:

      case '1234'
    

    也错了。这里,'1234' 表示字符串。它是一个多字节字符,这很可能是您不想要的。同样,即使您将其更改为 "1234" 之类的内容,它仍然是 不正确的 ,因为它不会为您提供 intended 值, 并且 strings 不能用于 case 语句 values.

解决方法:这里不使用switch的情况,你可以尝试使用strcmp()来比较传入的字符串并相应地选择。


注:main()推荐签名为int main(int argc, char *argv[])

您混淆了 char(字符)和 char *(字符串)。您也不能将字符串用作 switch/case 标签。这是您的代码的固定版本:

#include <stdio.h>

int main(int argc, const char *argv[]) {

    const char *argOne = argv[1];
    const char *argTwo = argv[2];

    if (strcmp(argOne, "1234) == 0)
    {
        printf("1234!\n");
    }
    else
    {
        printf("Invalid\n");
    }        
    return 0;
}

您不能(真的)"convert" 指向 char 的指针指向单个 char。但是,您可以从字符串中提取一个字符。

例如,要获取程序第一个参数的第一个字符,您可以执行例如

char first_char_of_first_arg = 0;
if (argv > 1)
    first_char_of_first_arg = argv[1][0];

首先 main 的标准声明看起来像

int main(int argc, char *argv[])
                   ^^^^^^

即第二个参数没有限定符const.

其次,argv[1] 的类型为 char *。将它与类似于 '1234'character 文字进行比较没有任何意义。至于 string literal "1234" 时可能不会用在 case label.

你要的是下面的

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

int main(int argc, char *argv[]) {

    if ( argc > 2 )
    { 
        char *argOne = argv[1];
        char *argTwo = argv[2];

        if ( strcmp( argOne, "1234" ) == 0 )
        {
            puts( "1234!" );
        }
        else
        {
            puts( "Invalid" );
        }
    }
}

代码有几个问题

在启用所有警告的情况下进行编译将允许编译器 显示那些问题。

对于 gcc,至少使用:'-Wall -Wextra -pedantic'

注意:需要修复警告,因为编译器比你或我更了解 C 语言。

#include <stdio.h>

int main(int argc, const char *argv[])
{
    //<< parameter argc not used
    //   and it should be used to assure that argv[1] and argv[2] actually exist

    char argOne = argv[1];
    //<< argv[1] is a pointer to a character string.
    //   argOne is a single char
    //   it should be: 'char argOne = argv[0][0];'

    char argTwo = argv[2];
    //<< argv[2] is a pointer to a character string.
    //   argTwo is a single character
    //   it should be: 'char argTwo = argv[1][0];'
    //<< argTwo is not used

    switch(argOne)
    //<< a character can be treated as an int, but due care needs to be exercised
    {
        case '1234' :
        //<< a case statement can only look at an 'int',
        //   not a pointer to a (in this case unterminated) string
        //   and argOne is a single char, not a pointer to a unterminated string
            printf("1234!\n" );
            break;
        default :
        printf("Invalid\n" );
        //<< for human readability, use consistent indentation
        //   and never use tabs for indenting
        //<< every case should be terminated with 'break;'
        //   unless the case is to fall through to the next case
        //   I.E. just because a syntax 'can' be used does not mean it 'should' be used
    }
}