无法使用 strcpy 对命令行参数进行排序
Cannot sort command line arguments using strcpy
我是 C/C++ 的新手,正在学习命令行参数。我正在尝试使用 strcpy 对我的命令行参数进行排序,但是它给了我错误的输出。
例如
i/p : 我是
o/p : 朋友
我
任何人都可以帮助我解决我在这里做错了什么吗?请注意:我只是 运行 这个程序,只有 argc=3,我只是 运行 这个输入代码(将被排序),如上例所示。
我刚刚删除了用于调试的循环。
#include "iostream"
#include "cstdlib"
#include "cstring"
using namespace std;
int main (int argc, char **argv)
{
char temp[100];
//sorting my command line arguments
if(strcmp(argv[1],argv[2])>0)
{
strcpy(temp,argv[1]);
strcpy(argv[1],argv[2]);
strcpy(argv[2],temp);
}
cout<<argv[1]<<endl;
cout<<argv[2]<<endl;
return 0;
}
考虑一下你的内存布局。当你运行$ ./a.out i am
,程序启动时会是这样:
a . o u t [=10=] i [=10=] a m [=10=]
^ ^ ^
argv[0] argv[1] argv[2]
在您的交换过程中写入 argv[1]
会将其更改为:
a . o u t [=11=] a m [=11=] m [=11=]
^ ^ ^
argv[0] argv[1] argv[2]
然后写入 argv[2]
将再次更改为:
a . o u t [=12=] a m i [=12=] [=12=]
^ ^ ^
argv[0] argv[1] argv[2]
所以当你打印出 argv[1]
时,它会读取到空字节,给你 ami
。 argv[2]
将从不同的起点阅读,给你 i
.
正如 Galik 指出的那样,这是因为 argv[1]
和 argv[2]
不是某种自动调整大小的缓冲区。它们只是指向内存的指针。在这一点上我应该注意,确切的布局并没有由语言正式定义;根据您使用的平台,您可能会遇到各种不同的不可预测的行为。
要解决此问题,您应该创建一个指向要排序的字符串的指针数组,并交换指针而不是字符串的值。这将更快(需要复制的字节更少)和更安全(意外溢出缓冲区的方式更少,如果您的输入之一超过 100 个字符,您当前的代码就会发生这种情况)。
我是 C/C++ 的新手,正在学习命令行参数。我正在尝试使用 strcpy 对我的命令行参数进行排序,但是它给了我错误的输出。 例如
i/p : 我是
o/p : 朋友 我
任何人都可以帮助我解决我在这里做错了什么吗?请注意:我只是 运行 这个程序,只有 argc=3,我只是 运行 这个输入代码(将被排序),如上例所示。 我刚刚删除了用于调试的循环。
#include "iostream"
#include "cstdlib"
#include "cstring"
using namespace std;
int main (int argc, char **argv)
{
char temp[100];
//sorting my command line arguments
if(strcmp(argv[1],argv[2])>0)
{
strcpy(temp,argv[1]);
strcpy(argv[1],argv[2]);
strcpy(argv[2],temp);
}
cout<<argv[1]<<endl;
cout<<argv[2]<<endl;
return 0;
}
考虑一下你的内存布局。当你运行$ ./a.out i am
,程序启动时会是这样:
a . o u t [=10=] i [=10=] a m [=10=]
^ ^ ^
argv[0] argv[1] argv[2]
在您的交换过程中写入 argv[1]
会将其更改为:
a . o u t [=11=] a m [=11=] m [=11=]
^ ^ ^
argv[0] argv[1] argv[2]
然后写入 argv[2]
将再次更改为:
a . o u t [=12=] a m i [=12=] [=12=]
^ ^ ^
argv[0] argv[1] argv[2]
所以当你打印出 argv[1]
时,它会读取到空字节,给你 ami
。 argv[2]
将从不同的起点阅读,给你 i
.
正如 Galik 指出的那样,这是因为 argv[1]
和 argv[2]
不是某种自动调整大小的缓冲区。它们只是指向内存的指针。在这一点上我应该注意,确切的布局并没有由语言正式定义;根据您使用的平台,您可能会遇到各种不同的不可预测的行为。
要解决此问题,您应该创建一个指向要排序的字符串的指针数组,并交换指针而不是字符串的值。这将更快(需要复制的字节更少)和更安全(意外溢出缓冲区的方式更少,如果您的输入之一超过 100 个字符,您当前的代码就会发生这种情况)。