#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int string_cmp(const void *p, const void *q);
int main(int argc, char **argv)
{
int i; // variable
char **words_array = malloc(sizeof(char*)*(argc+1)); // sets new array to hold the words
char *p; // another char pointer array
p = *words_array; // set both equal to eachother
for(; *p < (argc - 1); p++) // for loop
{
p = malloc(strlen(*argv) + 1); // determines size based on user input
argv++; // increments
strcpy(p++, *argv); // copies words to the new array
}
p = NULL; // resets p
qsort(words_array, argc-1, sizeof(char *), string_cmp); // sorts the array
for(i = 0; i < argc - 1; i++){ // for loop to print properly
printf("%s ", words_array[i]);
}
printf("n");
return 0;
}
int string_cmp (const void *p, const void *q) // compares the two different strings and returns a value
{
const char *value = *(const char**)p;
const char *value_two = *(const char**)q;
return strcmp(value, value_two);
}
所以我的程序应该接受命令行参数并使用 Qsort 返回排序的它们。示例是"./a.out 你好黑暗我的老朋友应该返回为黑暗朋友你好我的老朋友。我没有收到任何编译器错误,而是遇到分段错误,我不确定如何使用指针算法解决此问题。
您正在递增双指针(argv),即;
for(; *p < (argc - 1); p++) // for loop
{
p = malloc(strlen(*argv) + 1); // determines size based on user input
argv++; // increments
strcpy(p++, *argv); // copies words to the new array
}
所以把它改成(*argv)++
问题出在您的 for 循环中。你把*p
与argc
进行比较,这是没有意义的。将循环替换为标准计数器i
。
for (i = 1; i < argc; i++)
请注意,它应该argc
使用而不是argc - 1
,并且循环应该从 1 开始而不是从 0 开始。此外,在循环中您可以使用argv[i]
而不是*argv
是一些建议:
将char** argv
更改为char* argv[]
argc
返回的参数数大于实际传递的参数数。额外的计数用于可执行文件名称本身。
所以最好做一些错误检查,做:
argc--;
if(argc > 0) // We have some arguments
{
/* Do something
* char **words_array = malloc(sizeof(char*)*(argc+1)
* may be changed to
*/
char **words_array;
words_array=malloc(argc*sizeof(char*));
/* Coming down
* You could change that for-loop to something like this.
*/
for(int i=0;i<argc;i++)
words_array[i]=argv[i]; // You have all the arguments stored in words_array
/* Now go on sort words_array
* and so and so forth
*/
}