提前感谢您阅读本文,
我正在练习通过编写一个接受一个参数并返回其大小的程序来从命令行获取和操作参数。根据我的阅读,每个命令行参数都是空终止的,每个单独的字符都可以像普通的2D数组一样被访问(如果我错了,请纠正我)。所以我写道:
for (int i = 0; i > -1; i++)
{
cout << "Doing " << &argv[1][i] << endl;
if (&argv[1][i] != "\0") Size++;
else break;
}
这在g ++下编译很好,但是当我运行它时,会发生这种情况:
user@computer:~/Programming$ ./ReturnSize 12345
Doing 12345
Doing 2345
Doing 345
Doing 45
Doing 5
Doing
Doing ORBIT_SOCKETDIR=/tmp/orbit-user
然后它继续进行直到它出现段错误。 我究竟做错了什么?有没有更好的方法来确定参数的大小/访问参数中的单个元素?
答案 0 :(得分:2)
在本声明中
if (&argv[1][i] != "\0") Size++;
比较两个指针(字符串文字隐式转换为指向此表达式中第一个元素的指针)。因为它们占用不同的内存区域,所以if语句中的条件总是等于true,除非数组彼此重叠。
将此声明更改为
if ( argv[1][i] != '\0' ) Size++;
要获取命令行参数的大小,可以使用标题std::strlen
中声明的标准C函数<cstring>
例如
size_t Size = std::strlen( argv[1] );
至于你的循环,那么它可以写得更简单
size_t Size = 0;
while( argv[1][Size] )
{
cout << "Doing " << &argv[1][Size] << endl;
++Size;
}
答案 1 :(得分:2)
for (int i = 0; i > -1; i++)
真的???
一个简单的方法::
#include<iostream>
#include<cstdlib>
int main(int argc, char* argv[])
{
for (int i = 1; i < argc; ++i)
{
std::string temp = argv[i];
std::cout << temp << " | " << temp.length() << std::endl;
Size = temp.length();
}
return 0;
}
答案 2 :(得分:1)
除了整个程序有点奇怪(参见pippin1289的评论)之外,你的if条件是错误的:你想:
if (argv[1][i] != '\0')
答案 3 :(得分:1)
for循环毫无意义。你递增i并测试它是否大于-1。当然如此。对字符串“\ 0”的测试与对空字符'\ 0'的测试不同。这是你麻烦的原因之一。我也不会在第一时间逐个字符地循环。您只需将整个字符串发送到流,或使用C库函数。
答案 4 :(得分:0)
可以评估任何布尔表达式。例如,您可以写:
for (int i = 0; true; i++) {
}
这就是说,像
for (int i = 0; i argv[1][i] != '\0'; i++) {
}
可能有效但非常规