What does “passing argument 2 of strcmp makes pointer from integer without a cast” error in C mean?
我正在编译我的C代码,并遇到两个错误:
warning:passing argument 2 of strcmp makes pointer from integer without a cast
和
warning: note: expected const char * but argument is of type int
这是我的主要:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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 "); } //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: "); } } } |
这就是说的话。
您似乎打算将
在" C"中," ||"运算符是布尔"或"运算,而不是串联运算。同样,撇号的使用表示单个字符,基本上是"字符"类型。
我想你想要这样的东西(对于第148行):
或者,如果您的C库支持它:
1 | if (strcasecmp(argv[2],"C") == 0) |
这是不区分大小写的比较。
我相信您在这里的目的是将命令行参数(argv [2])与字符(字符串)" C"或" c"进行比较,即您是否在命令行中给了c或C。
SO用户已经提供了解释。您需要使用
(strcmp(argv[2],"C")==0 || (strcmp(argv[2],"c")==0)
为了消除您的警告。
但是,这不是解析C中命令行参数的最佳方法。如果解析用户输入时您的程序过于复杂,我建议您使用库" getopt"。它旨在帮助用户以结构化的方式解析和分析输入。
这是一个小代码窃听器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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, longIndex ); } |
请在一些文档(或Linux手册页)中搜索getopt和getopt_long。这是来自GNU的示例。