我正在编译我的C代码并且遇到两个错误:
警告:传递strcmp的参数2使得整数指针没有强制转换
和
警告:注意:预期的const char *但参数的类型为int
这是我的主要内容:
int main(int argc, char *argv[])
{
//check to make sure that the command line arguments are valid
if(argc!=3)
{
printf("invalid function call try again\n");
}
//else to choose the proper command
else
{
//reverse routine A
if(strcmp(argv[2],'a'||'A')==0) //line 138
{
reva(argv[1]);
}
//reverse routine B
else if(strcmp(argv[2],'b'||'B')==0) //line 143
{
revb(argv[1]);
}
//reverse routine C
else if(strcmp(argv[2],'c'||'C')==0) //line 148
{
revc(argv[1]);
}
//unacceptable command line argumant
else
{
printf("unacceptable command line argument for reverse routine try again:\n");
}
}
}
答案 0 :(得分:6)
这意味着它所说的。 'a'||'A'
是一个整数 - 具体来说,它是整数1
。 strcmp
的第二个参数必须是字符串,而不是整数。
您似乎打算将argv[2]
与a
和A
进行比较。您需要两个不同的strcmp
调用。此外,您需要使用双引号,而不是单引号。
答案 1 :(得分:3)
在“C”中,'||' operator是一个布尔'或'操作,而不是连接操作。此外,使用撇号表示基本上为'char'类型的单个字符。
我想你想要这样的东西(第148行): if(strcmp(argv [2],“C”)== 0 ||(strcmp(argv [2],“c”)== 0)......
或者,如果您的C库支持它: if(strcasecmp(argv [2],“C”)== 0) 这是一个不区分大小写的比较
答案 2 :(得分:1)
我相信你的对象是将命令行参数(argv [2])与字符(字符串)“C”或“c”进行比较,即只是用户在命令行中给出了c或C
SO用户已经提供了解释。你需要使用
(strcmp(argv [2],“C”)== 0 ||(strcmp(argv [2],“c”)== 0)
为了消除你的警告。
但是,这不是在C中解析命令行参数的最佳方法。如果在解析用户输入时程序太复杂,我建议使用库“getopt”。它旨在帮助用户以结构化的方式解析和分析输入。
这是一个小代码片段
opt = getopt_long( argc, argv, optString, longOpts, &longIndex );
while( opt != -1 ) {
switch( opt ) {
case 'I':
globalArgs.noIndex = 1; /* true */
break;
case 'l':
globalArgs.langCode = optarg;
break;
case 'o':
globalArgs.outFileName = optarg;
break;
case 'v':
globalArgs.verbosity++;
break;
case 'h': /* fall-through is intentional */
case '?':
display_usage();
break;
case 0: /* long option without a short arg */
if( strcmp( "randomize", longOpts[longIndex].name ) == 0 ) {
globalArgs.randomized = 1;
}
break;
default:
/* You won't actually get here. */
break;
}
opt = getopt_long( argc, argv, optString, longOpts, amp;longIndex );
}
请搜索一些文档(或linux手册页)以获取getopt和getopt_long。以下是GNU的示例。