我在C中使用strcmp
时遇到问题。
我正在尝试使用strcmp
来比较程序的参数,但即使字符串相同也不起作用。这是代码的一部分。
while(strcmp(argv[i], "-e") != 0)
因此,对于i = 11,如果我打印argv[i]
的值,我得
printf("String %s i %d", argv[i],i);
>> String -e i 11
但是一直在继续。任何想法为什么会发生这种情况?
代码:
while(strcmp(argv[i], "-e") != 0 || i != argc)
{
printf("String %s i %d", argv[i],i);
if(!isdigit((unsigned char)*argv[i]) && strcmp(argv[i], "-t") != 0)
{
archivo = fopen(argv[i] , "r");
TOT_IMG = TOT_IMG + 1;
for(t=0;t<NUM_FUNC_TRAZO;t++)
{
for(d=0;d<NUM_FUNC_DIAMETRICA;d++)
{
for(c=0;c<NUM_FUNC_CIRCO;c++)
{
if (fscanf(archivo, "%s",el) != EOF)
{
par->vector_circo[t][d][c] = strtod(el,NULL);
par->clase = clase;
}
else
{
break;
}
}
}
}
par_temp = par;
par->siguiente = (parametros_lista) malloc(sizeof(parametros_elem));
par = par->siguiente;
par->anterior = par_temp;
}
else
{
if(strcmp(argv[i], "-t") != 0)
{
clase = atoi(argv[i]);
CLASES = CLASES + 1;
}
}
i = i + 1;
}
答案 0 :(得分:2)
让我们来看看:
while(strcmp(argv[i], "-e") != 0 || i != argc)
好的,我们假设strcmp
在0
为“e”时正确返回argv[i]
。我们假设这是因为
如果strcmp
返回0会怎样?好吧,事情不仅仅停止,你的代码检查strcmp
是否为真。是吗?我的通灵调试技巧告诉我你应该研究i != argc
的第二部分。
您可能还需要注意,您的代码可能会访问while
,argv[argc]
。如果NULL
在输入为strcmp
时宽松,你可能会很幸运,但这是你应该修复的错误。
答案 1 :(得分:1)
我建议您使用getopt (3)。这是广泛使用的符合POSIX的参数解析方法。
还有另一个与在Windows上实现getopt.h
界面相关的问题:getopt.h: Compiling UNIX C-Code in Windows。重要的是回答(Xgetopt)所以可移植性应该不是这样。