我正在尝试从命令行参数进行输入。这是我在c
中的代码int main(int argc, char * argv[]) {
int i;
if (argc == 0)
{
printf("ERROR: You need an argument.\n");
// We are out of here!
return 1;
}
for( i = 0; i < argc; i += 1 )
{
char *pos = argv[0]; // pos is the pointer to the first position
int possize = sizeof(argv[0]);
for(i=0;i<possize;i++)
{
printf("%c",pos[i]);
}
printf("\n");
}
return 0;
}
当我试图从终端运行它时。我输入了gcc main.c -o main,然后是./main,它给了我./mainT。为什么这样做?任何人都可以帮我修理它,谢谢你。
答案 0 :(得分:1)
您需要修复两个错误:
argv[0]
不是第一个参数,它是您程序的名称。如果要打印初始命令行参数,请改用argv[i]
,并确保从i
开始1
。sizeof(argv[1])
不会产生参数的长度;请改用strlen
。答案 1 :(得分:0)
由于argv[0]
始终包含您调用该程序的字符串,因此argc
始终至少为1.
所以正确的版本是:
int main(int argc, char * argv[]) {
int i;
if (argc == 1)
{
printf("ERROR: You need an argument.\n");
// We are out of here!
return 1;
}
// loop through all arguments
for( i = 1; i < argc; ++i )
{
char *pos = argv[i];
int possize = strlen(argv[i]); //<-- use strlen here, not sizeof
for(i=0;i<possize;i++)
{
printf("%c",pos[i]);
}
printf("\n");
}
return 0;
}
另请注意,sizeof(argv[0])
会返回指针的大小,而不是
字符串的长度。您需要strlen
(请参阅上面的更正版本)。
在x86_64系统上,指针的大小通常为8,因此sizeof(argv[0])
将返回8.因为您使用./main
执行了该程序,该字符串
"./main"
的长度为6,因此您的循环访问内存超出范围,从而产生未定义的行为。