所以我编写了一个代码,按照正确的顺序对单词进行排序。这些单词是通过指针存储的,我在程序中初始化了另一个char数组来存储char* argv
。
最后一个for循环是打印段故障的原因,我无法弄清楚原因。
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
int i, j;
char *key;
char a[argc-1];
for(i=1; i < argc; i++){
a[i-1]= tolower(argv[i]);
}
for (i = 2; i < argc; i++) {
key = argv[i];
j = i-1;
while (j >= 1 && strcmp(argv[j], key) > 0) {
argv[j+1] = argv[j];
j--;
}
argv[j+1] = key;
}
for(i = 1; i < argc; i++){
a[i-1] = *argv[i];
}
for (i = 1; i < argc ; i++){
puts(argv[i]);
}
for(i = 0; i < argc-1; i++){
printf("%s", a[i]);
}
return 0;
}
输入
./a.out orange banana apple
输出
apple
banana
orange
Segmentation fault
答案 0 :(得分:1)
您的代码中存在多个问题
行a[i - 1] = tolower(argv[i])
错误,因为tolower()
将int
作为参数并且您正在传递char *
,因此它将指针转换为int
在c中是合法的,但不保证定义的行为。
您没有在'\0'
数组上设置a
终结符,这是造成问题的另一个原因,特别是当您尝试将其用作字符串时,char
数组不是字符串,除非,它是一个带有终止'\0'
字节的可打印字节序列。
分配argc - 1
不起作用,因为
argc
的值是可执行文件的传递参数数。argv
所找到的相应strlen()
的长度,则需要1个字节而不是更少,所以在任何情况下都是argc + 1
。答案 1 :(得分:0)
你为什么使用%s
for(i = 0; i < argc-1; i++){
printf("%s", a[i]);
尝试%c
答案 2 :(得分:0)
你的编译器也应该给你一个警告:
printf("%s", a[i]);
警告:format指定类型'char *'但参数具有类型 'char'[-Wformat]
如果您将其更改为%c
,则正常。
正如警告所说,当你使用它%s
时,printf期待一个字符串或char*
,并将其视为这样。 a[i]
是一个整数类型,可以引用内存中的无效位置。因此,正确的方法是使用%c,并打印一个字符;或使用%s并传递char *作为第二个参数。
或者你想要args in a。改变退场。
char *a[argc-1];
然后更改作业。
a[i-1] = argv[i];