如何按字母顺序对句子中的每个单词排序?

时间:2019-04-05 21:10:24

标签: c

我需要按字母顺序对句子中的每个单词进行排序,同时使单词彼此分开。我不允许使用strtok()函数。

示例输入:I would really appreciate some help

示例输出:I dlouw aellry aaceeipprt emos ehlp

我设法按字母顺序对整个字符串进行排序。这给出的输出为:Iaaacdeeeeehillllmooppprrstuwy

我不确定是否应该将当前代码嵌套到循环中,该循环将在每次有空间时重新开始。或者,如果我需要将字符串读取到二维数组中并分别对每个单词进行排序。

我也不确定比较每个字符的值或计算字符串中每个字母的出现是否更有意义。每个版本都有一个版本,上面显示了输出。

先谢谢了。

版本比较字符:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main () {

    char str[100];

    printf("Please type a sentence :\n");
    scanf("%[^\n]s", str);

    printf("\nAlphabetical order:\n:);

    char temp;

    int i, j;
    int n = strlen(str);

    for (i = 0; i < n-1; i++) {
        for (j = i+1; j < n; j++) {
            if (str[i] > str[j]) {
                temp = str[i];
                str[i] = str[j];
                str[j] = temp1;
            }
        }
    }

    printf(str);

    return 0;
}

每个字符的版本计数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main () {

  char ch, input[100], output[100];
  int no[26] = {0}, n, c, t, x;

  printf("Please type a sentence:\n");
  scanf("%s", input);

  n = strlen(input);

  for (c = 0; c < n; c++)
  {
    ch = input[c] - 'a';
    no[ch]++;
  }

  t = 0;

  for (ch = 'a'; ch <= 'z'; ch++)
  {
    x = ch - 'a';

    for (c = 0; c < no[x]; c++)
    {
      output[t] = ch;
      t++
    }
  }
  output[t]  = '\0';

  printf("%s\n", output);

  return 0;

}

3 个答案:

答案 0 :(得分:0)

std::sort 将排序您给它的任何顺序。例如

std::sort(str.begin(),str.begin()+5);
std::sort(str.begin()+6,str.end());
std::cout<<str;

应输出Hello dlorw。如果要区别对待大写字母,可以放置自定义比较运算符。

现在,您只需要遍历单词。请不要随意混合使用C ++和C。

答案 1 :(得分:0)

标准库具有足够的功能,您无需编写自己的任何循环。参见:

How do I tokenize a string in C++?

关于使用文字和

The C++ standard algorithms library

用于排序等。哦,您可能还需要阅读迭代器。

答案 2 :(得分:0)

使用fgets()读取用户输入。尝试使用输入之前,请先验证成功。

char buffer[1024];
if (fgets(buffer, sizeof buffer, stdin)) {
  const char *s = buffer;

搜索字母。使用isalpha()

  while (*s) {
    while (!isalpha((unsigned char)*s) && *s) {
      putchar(*s);
      s++;
    }
    const char *start = s;
    while (isalpha((unsigned char)*s)) {
      s++;
    }

qsort()排序并使用精度进行打印。现在s不需要空字符终止。避免使用sizeof(type)并使用sizeof *pointer,因为这样可以更轻松地正确编码,检查和维护代码。

    int len = s - start;
    qsort(start, len, sizeof *start, fcmp);
    printf("%.*s", len, start);
  }
}

fcmp()仅比较字符。标准库倾向于将char的值视为转换为unsigned char的值。

int fcmp(const void *va, const void *vb) {
  const unsigned char *a = va;
  const unsigned char *b = vb;
  return (*a > *b) - (*a < *b);
}

代码可能使用了return a - b;。上面的内容比较惯用,从不涉及int溢出(不同于那些带有CHAR_MAX > INT_MAX的稀有机器)。