Home > OS >  I get weird symbols in the output in the terminal
I get weird symbols in the output in the terminal

Time:03-12

I am trying to make a program that would take a sentence from the user and reverse the order of the words while keeping the special characters ['.','?','!'] at the end. the problem I'm getting is that I get weird symbols after the last word and the special character. I am programming using C. I think it's because the last element printed is not a '\0'. but I don't know how to fix that.

My code:

#include <ctype.h>

#define N 200


int main()
{
    char arr[N] = { 0 }; 

    char* p, * q, mark = 0; 
    int c;
   
    p = arr;
    printf("Enter a sentence: ");
    while ((c = getchar()) != '\n' && p < arr   N) 
    {

        if (c == '?' || c == '.' || c == '!') 
        {
            mark = c;
            break;
        }
        else 
            *p   = c;
    }
    *p = '\0'; 
    printf("Reversal of sentence: ");
    while (p >= arr) 
    {
        while (*--p != ' ' && p != arr); 
        if (p == arr) {q = arr;} 
        else {q = p   1;} 
         
        
        while (*q != '\0' && *q != ' ')
        { 
            printf("%c", *q  ); 
        }
        if (p >= arr) 
        {
            printf(" ");
        }
       
        
    }
    printf("%c", mark); 
    printf("\n");
    return 0;
}

CodePudding user response:

I've fixed the overflow error when reading the sentence by removing the \0 termination. The input string is never used by anything that cares. I've also added a check for End-Of-File.

Next I changed the reversal loop to not underflow and fixed outputing an extra ' ' before the mark.

Last the printf calls can use putchar instead.

#include <ctype.h>
#include <stdio.h>

#define N 200


int main()
{
    char arr[N] = { 0 }; // initialization optional, nothing cares

    char* p, * q, mark = 0;
    int c;

    p = arr;
    printf("Enter a sentence: ");
    while ((c = getchar()) != '\n' && c != EOF && p < arr   N)
    {

        if (c == '?' || c == '.' || c == '!')
        {
            mark = c;
            break;
        }
        else
            *p   = c;
    }
    printf("Reversal of sentence: ");
    while (p > arr)
    {
        while (*--p != ' ' && p != arr);
        if (p == arr) {q = arr;}
        else {q = p   1;}

        while (*q != '\0' && *q != ' ')
        {
            putchar(*q  );
        }
        if (p > arr)
        {
            putchar(' ');
        }
    }
    putchar(mark);
    putchar('\n');
    return 0;
}
  • Related