gpt4 book ai didi

c++ - 无法使用 strcpy 对命令行参数进行排序

转载 作者:行者123 更新时间:2023-11-28 05:00:16 25 4
gpt4 key购买 nike

我是 C/C++ 的新手,正在学习命令行参数。我正在尝试使用 strcpy 对我的命令行参数进行排序,但是它给了我错误的输出。例如


我/我:我是


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  \0 i  \0 a  m  \0
^ ^ ^
argv[0] argv[1] argv[2]

在交换过程中写入 argv[1] 会将其更改为:

a   .   o  u  t  \0 a  m  \0 m  \0
^ ^ ^
argv[0] argv[1] argv[2]

然后对 argv[2] 的写入将再次更改为:

a   .   o  u  t  \0 a  m  i  \0 \0
^ ^ ^
argv[0] argv[1] argv[2]

因此,当您打印出 argv[1] 时,它将一直读取到空字节,为您提供 amiargv[2] 将从不同的起点读取,为您提供 i

正如 Galik 指出的那样,这是因为 argv[1]argv[2] 不是某种自动调整大小的缓冲区。它们只是指向内存的指针。在这一点上我应该注意,确切的布局并没有由语言正式定义;根据您使用的平台,您可能会遇到各种不同的不可预测的行为。

要解决此问题,您应该创建一个指向要排序的字符串的指针数组,并交换指针而不是字符串的值。这将更快(需要复制的字节更少)和更安全(意外溢出缓冲区的方式更少,如果您的输入之一超过 100 个字符,您当前的代码就会发生这种情况)。

关于c++ - 无法使用 strcpy 对命令行参数进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46209736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com