1

I have been trying to remove the repeated consecutive characters from a string using c language for an assignment.

The input is like: sheeeiiisccommminng

The output must be like: sheiscoming

But I am getting the output: sheiscomng

I am not able to find out what went wrong here, please give your valuable insights.

Here is my code:

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

void main() {
    char str[100];
    int i, j, k, len;
    printf("Enter any string: ");
    fgets(str, 100, stdin);
    len = strlen(str);
    for (i = 0; i < len; i++) {
        j = i + 1;
        k = i + 2;
        while (j < len) {
            if (str[j] == str[i]) {
                j++;
            } else {
                str[k] = str[j];
                k++;
                j++;
            }
        }
        len = k;
    }
    printf("\nString after removing characters:"); 
    for (i = 0; i < len; i++) {
        printf("%c", str[i]);
    }
}
chqrlie
  • 98,886
  • 10
  • 89
  • 149
priyag
  • 23
  • 3

2 Answers2

2

You should update the length of the string with len = k; after the end of the for loop.

Note however that you should also set a null terminator at the new length when you shorten the string to make it a proper C string.

Here is a simpler version:

#include <stdio.h>

int main() {
    char str[100];
    int i, j;

    printf("Enter any string: ");
    if (fgets(str, sizeof str, stdin)) {
        for (i = j = 0; str[i] != '\0'; i++) {
            if (j == 0 || str[j - 1] != str[i]) {
                str[j] = str[i];
                j++;
            }
        }
        str[j] = '\0';
        printf("String after removing characters: %s\n", str);
    }
    return 0;
}
chqrlie
  • 98,886
  • 10
  • 89
  • 149
1

Not sure about your code but you could do something like

char str[]="sheeeeisssscommmiingg";
int i, j;
for(i=j=0; str[j]; i++)
{
    str[i]=str[j];
    for(j++; str[j]==str[i]; ++j);
}
str[i]=`\0`;
printf("\n%s", str);

After examining a character in the string via the outer loop, subsequent characters which are the same are skipped using the inner for loop.

The original string is overwritten.

At the end, the nul terminator is added to the end of the new string.

Also consider reading this.

Output in this case is:

sheiscoming
J...S
  • 4,713
  • 1
  • 15
  • 34