我正在尝试使用 C 中的
argv
从命令行读取单词,然后根据它们的长度按降序对它们进行排序。然而,我的排序算法产生了意想不到的输出。
我使用的代码如下:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
for (int i = 1; i < argc - 1; i++) {
for (int j = 1; j < argc - i - 1; j++) {
if (strlen(argv[j]) < strlen(argv[j + 1])) {
char temp_word[20];
strcpy(temp_word, argv[j]);
strcpy(argv[j], argv[j + 1]);
strcpy(argv[j + 1], temp_word);
}
}
}
puts("\n");
for (int i = 1; i < argc; i++) {
printf("%s ", argv[i]);
}
return 0;
}
gcc test.c -o test
./test I put this words
puwordI wordI I %
不幸的是,输出已损坏。我怀疑我的排序逻辑或处理命令行参数的方式可能存在问题。有人可以检查我的代码并提供有关如何按长度正确排序单词的指导吗?
您的代码有两个问题。首先,您尝试交换 argv
数组中字符串的
content:这不起作用,因为分配要交换的两个字符串的 shorter 的缓冲区将不足以容纳 '替换'从longer,并且会由于缓冲区溢出而导致未定义的行为。相反,只需交换实际的指针即可。
其次,你没有测试整个数组;从两个
- 1
循环的极限中取出 for
。
这是代码的更正版本:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
for (int i = 1; i < argc; i++) { // Use "argc" (not argc - 1)
for (int j = 1; j < argc - i; j++) { // Similarly, no -1 here!
if (strlen(argv[j]) < strlen(argv[j + 1])) {
char* temp_word;
temp_word = argv[j];
argv[j] = argv[j + 1]; // Just swap the pointers,
argv[j + 1] = temp_word; // not the string contents
}
}
}
puts("\n");
for (int i = 1; i < argc; i++) {
printf("%s ", argv[i]);
}
return 0;
}
您不应该修改参数字符串的内容,但您可以修改
argv
中的指针。因此,您应该只交换指针而不是字符串。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
for (int i = 1; i < argc; i++) {
for (int j = 1; j < argc - i; j++) {
if (strlen(argv[j]) < strlen(argv[j + 1])) {
char *temp = argv[j];
argv[j] = argv[j + 1];
argv[j + 1] = temp;
}
}
}
for (int i = 1; i < argc; i++) {
printf("%s ", argv[i]);
}
printf("\n");
return 0;
}