【问题标题】:How do I make this function take arbitrary strings?如何使此函数采用任意字符串?
【发布时间】:2016-03-25 00:29:08
【问题描述】:

所以基本上,现在,这个函数只能接受 9 个单词,每个单词 10 个字符。我怎样才能使它可以占用arbitrary 数量的wordscharacters 并按字母顺序对它们进行相应的排序?

int sortText(){ 
  char name[10][9], tname[10][9], temp[10];
  int i, j, n;

  printf("Enter the amount of words you want to sort (max 9):");
  scanf("%d", &n);
  printf("Enter %d words: ",n);
  for (i = 0; i < n; i++)
  {
      scanf("%s", name[i]);
      strcpy(tname[i], name[i]);
  }
  for (i = 0; i < n - 1 ; i++){
      for (j = i + 1; j < n; j++){
          if (strcmp(name[i], name[j]) > 0){
              strcpy(temp, name[i]);
              strcpy(name[i], name[j]);
              strcpy(name[j], temp);
          }
      }
  }
  printf("\n------------------------------------------\n");
  printf("%-3s %4s %11s\n", "Input","|", "Output");
  printf("------------------------------------------\n");
  for (i = 0; i < n; i++)
  {
      printf("%s\t\t%s\n", tname[i], name[i]);
  }
  printf("------------------------------------------\n");
  }

【问题讨论】:

  • 不,它可以包含 10 个单词,每个单词 8 个字符(加上字符串终止符)。
  • 您需要将字符串作为字符指针存储在动态分配的数组中。然后您可以对数组中的char * 项进行排序。这样,字符串和数组可以是任意长度。
  • 感谢您的反馈,您建议我如何完成此操作?我之前只用静态值而不是任意长度对 C 进行编程。

标签: c string bubble-sort


【解决方案1】:

仅对于 C,您应该使用位于动态的字符指针。 您可以通过实现链表来制作列表。然后 strcmp 仍然可以正常工作。 在此处查看链表: http://www.cprogramming.com/tutorial/c/lesson15.html

【讨论】:

    【解决方案2】:

    您有两个问题,每个问题都需要单独解决,但它们仍然可以以类似的方式解决,即使用动态内存分配,更重要的是重新分配 .

    这里有两个重要方面需要记住,第一个是字符串是一个字符数组(带有一个特殊的终止字符),并且您可以拥有一个指向位于内存中任何位置的数组的指针。

    如果我们从数据类型以及应该如何存储字符串开始,你想要的是一个数组数组,就像你现在拥有的一样,但是动态分配,这意味着你想要一个指针数组(指向字符串),但由于字符串数组也需要是动态的,因此您需要一个指向包含指向其他数组的指针的数组的指针,即指向 char:char ** 的指针的指针。

    现在,当我们知道要使用什么数据类型时,让我们考虑如何分配它。要为数组中的单个字符串分配空间,请使用 malloc 函数分配一个 char *

    char **strings = malloc(1 * sizeof(char *));
    

    这是最简单的部分。现在,在我们开始阅读实际字符串之前,让我们考虑一下如何将新字符串添加到您的集合中:这是通过使用realloc 函数重新分配您拥有的字符串数组来完成的:

    char **temp_strings = realloc(strings, current_count + 1 * sizeof(char *));
    if (temp_string == NULL)
    {
        // Allocation failed, handle error appropriately
    }
    strings = temp_strings;
    ++current_count;
    

    这里的变量current_count是字符串数组的当前长度,它最初应该初始化为1(因为我们在数组中只有一个字符串)。

    现在读取实际的字符串,这有点复杂,因为我们实际上无法读取整个字符串(因为我们不知道每行有多长)。相反,我们一次读取一个字符,并在我们换行时结束。我们还需要为每个字符重新分配字符串。

    可能是这样的:

    int ch;
    char *s = NULL;
    size_t current_length = 0;  // Current length of string
    
    while ((c = fgetc(stdin)) != EOF)
    {
        if (c == '\n')
            break;  // Newline, done with the current string
    
        if (s == NULL)
        {
            s = malloc(2);  // Allocate two character: One for c and one for the terminator
        }
        else
        {
            // The current length is not including the terminator
            // that's why we add two characters
            char *temp_s = realloc(s, current_length + 2);
            if (temp_s == NULL)
            {
                // Handle error
            }
            s = temp_s;
        }
    
        s[current_length++] = c;
        s[current_length] = '\0';  // Terminate as a string
    }
    
    if (s != NULL)
    {
        // "Add" the string to the array of strings
        strings[current_count] = s;
    }
    

    【讨论】:

    • 非常感谢您的反馈。但是,当我尝试实现您的代码时,它会产生很多错误。 Märkte att du var svensk när jag gick in på din profile。 Hur骷髅du föreslå att jag sammansatte våra lösningar in till en? :) mvh 乔尔。
    • @Joel Lugnt på jobbet(工作时安静)所以我制作了一个完整的程序供您阅读和测试:ideone.com/s7yWQ8
    • @Joel 好吧,我没有说它会解决你的整个程序。阅读输入后,您必须自己对其进行排序(就像您已经拥有的简单冒泡排序应该可以正常工作),而不是在复制 指针 的字符串上执行strcpy。正如你所看到的,我将stdin 传递给函数,使用FILE* 使函数更通用,它可以从任何标准输入流(如标准输入流)中读取。至少该程序为您提供了读取任意长度的任意数量字符串的函数,这似乎是您最大的问题。
    • 再次感谢 Joachim 的帮助。但是,我觉得我还没有学到的东西太多了,所以我现在对代码感到不舒服。您是否认为我的问题的另一个解决方案是使用 getline() 和 malloc / calloc 输入字符串的大小?因为根据我目前的知识,这是我觉得使用起来很舒服的唯一方法。你会推荐使用这种方法还是你的方法是最好的解决方案?干杯。
    • @Joel 你的意思是this getline function?然后它会简化整个阅读动态行,因为getline 会为你做到这一点。然后你只需要分配/重新分配字符串数组。或者,如果您知道要读取多少个字符串,则可以使用固定大小的字符指针数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2011-05-30
    • 2020-04-20
    • 1970-01-01
    • 2013-01-14
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多