C语言 指针算术分割问题


 #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 循环中。你把*pargc进行比较,这是没有意义的。将循环替换为标准计数器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
 */    
}

相关内容

  • 没有找到相关文章

最新更新