c - 使用 strcpy 交换元素在数组中不起作用
问题描述
我试图交换数组中的元素(这是非常基本的,但是当我尝试更改数组的索引时,它会弄乱整个数组)
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int swap;
int position;
char temp[1000];
char *i;
swap = 1;
while (swap == 1)
{
swap = 0;
position = 1;
while (position < (argc - 1))
{
if (strcmp(argv[position], argv[position + 1]) > 0)
{
strcpy(temp, argv[position + 1]);
strcpy(argv[position], argv[position + 1]);
strcpy(argv[position + 1], temp);
}
position++;
}
}
return (0);
}
从上面的代码中,如果我输入“hi”和“hello”,而不是打印“hello”“hi”,它会带来“hello”“lo”,这非常奇怪。
但是,当我只是简单地使用指针(下面的代码)时,它可以完美地工作。
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int swap;
int position;
char temp[1000];
char *i;
swap = 1;
while (swap == 1)
{
swap = 0;
position = 1;
while (position < (argc - 1))
{
if (strcmp(*(argv + position), *(argv +position + 1)) > 0 )
{
i = *(argv + position);
*(argv + position) = *(argv + (position + 1));
*(argv + position + 1) = i;
swap = 1;
}
position++;
}
}
return (0);
}
你能告诉我第一种方法有什么问题吗?
解决方案
argv 向量指向的参数通常结构如下:
"foo\0barbaz\0quux\0"
argv[1]
指向“f”,指向argv[2]
“b”并argv[3]
指向“q”。
现在你可以很容易地看到,如果你天真地交换参数和指向它们的指针,你就会弄乱它们;例如,如果你交换“foo”和“barbaz”,它看起来像这样:
"barbaz\0foo\0quux\0".
很好,但现在argv[2]
仍然指向同一个位置,即 barbaz 中的第二个“a”!
您的第一种方法更有缺陷,因为您使用argv
向量中的指针作为目标。首先,您复制foo
到argv[2]
:
"foo\0foo\0az\0quux\0"
然后barbaz
到argv[1]
"barbaz\0\0az\0quux\0"
你看,这完全搞砸了。
这就是为什么您的方法在不调整argv
-vector 中的指针的情况下不起作用的原因。
您提出的第二种方法确实应该完美无缺。
推荐阅读
- python - 如何在 kivymd 按钮中对齐文本?
- matlab - Octave - 在循环中将多个系列绘制到特定的图形/轴
- mysql - 如何使用一个查询的多个结果作为第二个查询的输入以生成报告
- excel - 自动填充范围到最后使用的行
- excel - 在工作表中提取交替值以计算平均值
- android - RewardedAd.Show() 已弃用重载
- python - 我需要帮助访问嵌套字典中的嵌套列表
- python - tensorflow-gpu 2.3 安装与 cuda 和 cudnn 无法检测 GPU?
- java - Leetcode - 检查 N 和它的双精度是否存在
- python - 如何组合和平均数据框矩阵中的值?