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
}
}
我搜索了很长时间才找到答案,但我只能找到 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
}
}