输出中的单词后不需要的字符

时间:2013-08-26 06:01:39

标签: c

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

#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();
}

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

2 个答案:

答案 0 :(得分:4)

你不是null terminating输出字符串。 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. ...

  6. 就排序而言,如果仅仅是为了学习那么它很好,否则你应该选择更高效的sorting algorithm

答案 1 :(得分:3)

C字符串以空值终止

使用

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);