#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你好黑暗我的老朋友应该作为黑暗的朋友回复我的老朋友。我没有得到任何编译器错误,但我得到一个分段错误,我不知道如何解决这个问题我的指针算术。
答案 0 :(得分:-1)
你正在递增双指针(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)++
答案 1 :(得分:-1)
这些是有点建议:
将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
*/
}
答案 2 :(得分:-1)
问题在于你的for循环。您将*p
与argc
进行比较,这是毫无意义的。用标准计数器i
替换循环。
for (i = 1; i < argc; i++)
请注意,应该使用argc - 1
来代替argc
,并且循环应该从1开始而不是从0开始。
此外,在循环中,您可以使用argv[i]
代替*argv