3

我创建了一个程序,它要求用户输入一个单词,然后按字母顺序排列该单词中的字母并将其存储在另一个字符串中。

#include <stdio.h>

main()
{
  char in[100],out[100],ch;
  int  i,len,j=0;

  //ask user for a word
  printf("Enter a word: ");
  scanf("%s",in);

  //arrange that word in alphabetical order
  for(ch = 'a'; ch <= 'z'; ++ch)
         for(i = 0; i < strlen(in); ++i)
               if(in[i] == ch)
               {
                        out[j] = ch;
                        ++j;
               }

  //print the word
  printf("%s",out);

  fflush(stdin);
  getchar();
}

问题是当单词存储在另一个字符串中时,该单词后面会有一些额外的字母或符号。有人可以告诉我我的代码可能有什么问题吗?

4

2 回答 2

4

你不是null 终止输出字符串。printf("%s",out);将继续输出字符,直到找到 0 ( '\0')。有很多选项可以解决这个问题:

  1. 在 for 循环之后将输出终止到当前迭代器位置:

    out[j] = '\0';

  2. 使输出与输入的长度相同:

    out[strlen(in)] = '\0';

  3. 声明一个 0 初始化的数组:

    char out[100] = { 0 };

  4. 自己用零填充输出数组:

    memset(out, 0; sizeof(out));

  5. ...

就排序而言,如果只是为了学习就可以了,否则你应该选择一个更高效的排序算法

于 2013-08-26T06:04:55.203 回答
3

C 字符串以 null 结尾

利用

out[j] ='\0';

printf

说明%s符搜索空终止。

在您的情况下,它会继续打印,直到找到一个,因此您会得到一些随机符号。

也避免使用fflush.

您可能还想更新逻辑以对大写字符进行排序。

你可能想用一个排序说bubble sort

  l=strlen(in);
  for(i = 0; i < l; i++)
  {
        for(j = i + 1; j < l - 1; j++)
            if(in[j-1] > in[j]){
                ch = in[j];
                in[j] = in[j-1];
                in[j-1] = ch;
            }
  }

  printf("Sorted String :%s",in);
于 2013-08-26T06:06:54.070 回答