【问题标题】:C convert const char * to charC 将 const char * 转换为 char
【发布时间】:2015-06-01 10:45:56
【问题描述】:

我搜索了很长时间才找到答案,但我只能找到solutionC++ 似乎不适用于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" );
    }
}

编译时:

警告:使用“const char *”类型的表达式初始化“char”的整数转换指针不兼容 [-Wint-conversion]

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

警告:将 case 值转换为 switch 条件类型的溢出(825373492 到 52)[-Wswitch]

case '1234' :
     ^

【问题讨论】:

  • 您需要从基本的 C 教程开始。您的代码有很多问题。
  • 哪个教程?我确实研究了几个小时,只需要一个提示。
  • 一个带你从指针到字符和 c 字符串到 switch/case 语句的工具。
  • 好的,但是我花了几个小时在无尽的垃圾中寻找那个。我不是在寻找推荐,而是您提到的教程名称。
  • 几乎所有教程。如果不需要涵盖任何复杂的内容。

标签: c char switch-statement


【解决方案1】:

在您的代码中,

  • 第 1 点:

     char argOne = argv[1];
    

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

  • 第 2 点:

      case '1234'
    

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

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


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

【讨论】:

  • 关于你的笔记,有没有理由推荐char *而不是const char *签名?我正在使用const char *,因为将string 转换为它似乎更容易;也许我错了。
  • @JackBauer 是的,因为我的注释中的签名在 C 标准中提到。您可以查找C11 doc,第 5.1.2.2.1 章以获得更多参考。 :-)
【解决方案2】:

您在char(字符)和char *(字符串)之间混淆了。您也不能将字符串用作开关/案例标签。这是您的代码的固定版本:

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

【讨论】:

  • 谢谢,我没有意识到不能在 switch 语句中使用字符串。我之前在关注本教程,但我注意到他们只使用了一个字符...tutorialspoint.com/cprogramming/switch_statement_in_c.htm
  • 是的,如果您仔细阅读该教程,您会发现您可以在 switch 语句中使用单个 chars,例如'A',但不是字符串。
  • 有道理。还有一个问题——如果我有一个const char *a = "a";,它还不能轻易转换成char吗?我知道可能是一个愚蠢的问题。
  • 您可以使用普通数组索引访问字符串中的任何单个字符,因此对于您的示例,您可以说:char b = a[0]; - 这会将b 设置为'a'
  • 再次感谢 - 您的回答真的很有帮助,我希望可以将多个答案标记为正确。
【解决方案3】:

首先 main 的标准声明是这样的

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

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

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

你想要的是以下

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

【讨论】:

  • 感谢您的解释,它真的很有帮助。我会仔细研究的。
【解决方案4】:

您不能(真的)将指向char 的指针“转换”为单个char。但是,您可以提取字符串中的一个字符。

例如,要获取程序第一个参数的第一个字符,您可以这样做,例如

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

【讨论】:

  • 有趣,我没有意识到 switch 语句只能使用单个 chars.,但现在你提到的内容是有意义的。谢谢
【解决方案5】:

代码包含几个问题

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

对于 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
    }
}

【讨论】:

    猜你喜欢
    • 2013-12-31
    • 2012-01-16
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多