Harith
Harith

Reputation: 571

Unwanted characters after word in output

I created a program that asks the user for a word and then it arranges the letters in that word in alphabetical order and stores it in another string.

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

The problem is when word is stored in the other string, there are some extra letters or symbols after that word. Can someone please tell me what could be possibly wrong with my code?

Upvotes: 3

Views: 1683

Answers (2)

P0W
P0W

Reputation: 47814

C strings are null terminated

Use

out[j] ='\0';

before printf

The %s specifier searches for a null termination.

In your case it keeps on printing until it finds one, so you get some random symbols.

Also avoid use of fflush.

You might want to update your logic to sort uppercase characters too.

You might want to use a sort say 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);

Upvotes: 3

huysentruitw
huysentruitw

Reputation: 28131

You're not null terminating the output string. printf("%s",out); will keep outputting characters until it finds 0 ('\0'). There are many options to fix this:

  1. terminate the output to the current iterator position after the for-loop:

    out[j] = '\0';

  2. make the output the same length as the input:

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

  3. declare a 0-initialized array:

    char out[100] = { 0 };

  4. fill the output array with zero's yourself:

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

  5. ...

As the sorting is concerned, if it's just for learning then it's fine, otherwise you should pick a more efficient sorting algorithm

Upvotes: 4

Related Questions