Remove extra blanks

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Registered User

    Remove extra blanks

    Hi experts,
    I'm trying to write a program that replaces two or more consecutive
    blanks in a string by a single blank.

    Here's what I did:

    #include <stdio.h>
    #include <string.h>
    #define MAX 80

    int main()
    {
    char s[MAX];
    int i, j;
    fgets(s, MAX, stdin);
    i=strlen(s);
    while(i)
    {
    while (s[--i]!=' ' && i>0) /*Find the last space*/
    ;
    j=i;
    while (s[--j]==' ' && j>0) /*Go to the last non-space*/
    ; /*char before s[i]*/

    if (s[j]!=' ')
    j++; /*Increment j so that s[j] is a space*/

    if (j<i) /*If extra spaces have been found, remove*/
    while (s[i]) /*them by left shifting */
    s[++j]=s[++i]; /*the characters on the right*/

    i=j;
    }
    puts(s);

    return 0;
    }

    The program works fine, but I have a feeling that I've made it
    unnecessarily complicated.


    Can anyone suggest ways on which I can improve upon the code? Is there
    a better algorithm?

  • CBFalconer

    #2
    Re: Remove extra blanks

    Registered User wrote:
    >
    I'm trying to write a program that replaces two or more consecutive
    blanks in a string by a single blank.
    >
    Here's what I did:
    >
    #include <stdio.h>
    #include <string.h>
    #define MAX 80
    >
    int main()
    {
    char s[MAX];
    int i, j;
    fgets(s, MAX, stdin);
    i=strlen(s);
    while(i)
    {
    while (s[--i]!=' ' && i>0) /*Find the last space*/
    ;
    j=i;
    while (s[--j]==' ' && j>0) /*Go to the last non-space*/
    ; /*char before s[i]*/
    >
    if (s[j]!=' ')
    j++; /*Increment j so that s[j] is a space*/
    >
    if (j<i) /*If extra spaces have been found, remove*/
    while (s[i]) /*them by left shifting */
    s[++j]=s[++i]; /*the characters on the right*/
    >
    i=j;
    }
    puts(s);
    >
    return 0;
    }
    >
    The program works fine, but I have a feeling that I've made it
    unnecessarily complicated.
    >
    Can anyone suggest ways on which I can improve upon the code? Is there
    a better algorithm?
    Try this. Notice the absence of string buffers. Should work until
    you get over 32767 consecutive blanks.

    #include <stdio.h>
    int main(void)
    {
    int blanks, ch;

    blanks = 0;
    while (EOF != (ch = getchar())) {
    if (' ' == ch) {
    ++blanks;
    if (1 == blanks) putchar(' ');
    }
    else {
    putchar(ch);
    blanks = 0;
    }
    }
    return 0;
    }

    --
    Chuck F (cbfalconer at maineline dot net)
    Available for consulting/temporary embedded and systems.
    <http://cbfalconer.home .att.net>


    Comment

    • Richard

      #3
      Re: Remove extra blanks

      "Registered User" <invalidinvalid invalid@gmail.c omwrites:
      Hi experts,
      I'm trying to write a program that replaces two or more consecutive
      blanks in a string by a single blank.
      >
      Here's what I did:
      >
      #include <stdio.h>
      #include <string.h>
      #define MAX 80
      >
      int main()
      {
      char s[MAX];
      int i, j;
      fgets(s, MAX, stdin);
      i=strlen(s);
      while(i)
      {
      while (s[--i]!=' ' && i>0) /*Find the last space*/
      ;
      j=i;
      while (s[--j]==' ' && j>0) /*Go to the last non-space*/
      ; /*char before s[i]*/
      >
      if (s[j]!=' ')
      j++; /*Increment j so that s[j] is a space*/
      >
      if (j<i) /*If extra spaces have been found, remove*/
      while (s[i]) /*them by left shifting */
      s[++j]=s[++i]; /*the characters on the right*/
      >
      i=j;
      }
      puts(s);
      >
      return 0;
      }
      >
      The program works fine, but I have a feeling that I've made it
      unnecessarily complicated.
      >
      >
      Can anyone suggest ways on which I can improve upon the code? Is there
      a better algorithm?
      >
      Much faster & efficient IMO (in most cases I would think) to
      malloc a new string, copy the original one into it and then update the
      original in place - no repeated shuffling.

      strcpy(refCopy, refStr)
      char *d=refStr; /*destination*/
      char *s=refCopy; /*original string copy - source*/
      while(*d++=(ch= *s++))
      if(ch==' '){
      while((ch=*s++) &&(ch==' ')); /*gobble up following spaces
      if (!(*d++=ch)) /* store first non space */
      break;
      }

      Not tested, but you will get the idea.


      --


      --

      Comment

      • Joe Wright

        #4
        Re: Remove extra blanks

        CBFalconer wrote:
        Registered User wrote:
        >I'm trying to write a program that replaces two or more consecutive
        >blanks in a string by a single blank.
        >>
        >Here's what I did:
        >>
        >#include <stdio.h>
        >#include <string.h>
        >#define MAX 80
        >>
        >int main()
        >{
        > char s[MAX];
        > int i, j;
        > fgets(s, MAX, stdin);
        > i=strlen(s);
        > while(i)
        > {
        > while (s[--i]!=' ' && i>0) /*Find the last space*/
        > ;
        > j=i;
        > while (s[--j]==' ' && j>0) /*Go to the last non-space*/
        > ; /*char before s[i]*/
        >>
        > if (s[j]!=' ')
        > j++; /*Increment j so that s[j] is a space*/
        >>
        > if (j<i) /*If extra spaces have been found, remove*/
        > while (s[i]) /*them by left shifting */
        > s[++j]=s[++i]; /*the characters on the right*/
        >>
        > i=j;
        > }
        > puts(s);
        >>
        > return 0;
        >}
        >>
        >The program works fine, but I have a feeling that I've made it
        >unnecessaril y complicated.
        >>
        >Can anyone suggest ways on which I can improve upon the code? Is there
        >a better algorithm?
        >
        Try this. Notice the absence of string buffers. Should work until
        you get over 32767 consecutive blanks.
        >
        #include <stdio.h>
        int main(void)
        {
        int blanks, ch;
        >
        blanks = 0;
        while (EOF != (ch = getchar())) {
        if (' ' == ch) {
        ++blanks;
        if (1 == blanks) putchar(' ');
        }
        else {
        putchar(ch);
        blanks = 0;
        }
        }
        return 0;
        }
        >
        Or maybe..

        #include <stdio.h>
        int main(void) {
        int ch, last = 0;
        while ((ch = getchar()) != EOF) {
        if (!(ch == ' ' && last == ch))
        putchar(ch);
        last = ch;
        }
        return 0;
        }

        --
        Joe Wright
        "Everything should be made as simple as possible, but not simpler."
        --- Albert Einstein ---

        Comment

        • Richard

          #5
          Re: Remove extra blanks

          Joe Wright <joewwright@com cast.netwrites:
          CBFalconer wrote:
          >Registered User wrote:
          >>I'm trying to write a program that replaces two or more consecutive
          >>blanks in a string by a single blank.
          >>>
          >>Here's what I did:
          >>>
          >>#include <stdio.h>
          >>#include <string.h>
          >>#define MAX 80
          >>>
          >>int main()
          >>{
          >> char s[MAX];
          >> int i, j;
          >> fgets(s, MAX, stdin);
          >> i=strlen(s);
          >> while(i)
          >> {
          >> while (s[--i]!=' ' && i>0) /*Find the last space*/
          >> ;
          >> j=i;
          >> while (s[--j]==' ' && j>0) /*Go to the last non-space*/
          >> ; /*char before s[i]*/
          >>>
          >> if (s[j]!=' ')
          >> j++; /*Increment j so that s[j] is a space*/
          >>>
          >> if (j<i) /*If extra spaces have been found, remove*/
          >> while (s[i]) /*them by left shifting */
          >> s[++j]=s[++i]; /*the characters on the right*/
          >>>
          >> i=j;
          >> }
          >> puts(s);
          >>>
          >> return 0;
          >>}
          >>>
          >>The program works fine, but I have a feeling that I've made it
          >>unnecessari ly complicated.
          >>>
          >>Can anyone suggest ways on which I can improve upon the code? Is there
          >>a better algorithm?
          >Try this. Notice the absence of string buffers. Should work until
          >you get over 32767 consecutive blanks.
          >#include <stdio.h>
          >int main(void)
          >{
          > int blanks, ch;
          > blanks = 0;
          > while (EOF != (ch = getchar())) {
          > if (' ' == ch) {
          > ++blanks;
          > if (1 == blanks) putchar(' ');
          > }
          > else {
          > putchar(ch);
          > blanks = 0;
          > }
          > }
          > return 0;
          >}
          >>
          Or maybe..
          >
          #include <stdio.h>
          int main(void) {
          int ch, last = 0;
          while ((ch = getchar()) != EOF) {
          if (!(ch == ' ' && last == ch))
          putchar(ch);
          last = ch;
          }
          return 0;
          }
          The problem is that I think the OP was only using fgets to get a sample
          string - it is therefore not the excercise to simplify the algorithm
          using getchar() or whatever.

          His spec was to remove excess spaces from a string.

          I could be wrong : if not, see other post.

          --

          Comment

          • Registered User

            #6
            Re: Remove extra blanks


            Richard wrote:
            Joe Wright <joewwright@com cast.netwrites:
            >
            CBFalconer wrote:
            Registered User wrote:
            >I'm trying to write a program that replaces two or more consecutive
            >blanks in a string by a single blank.
            >>
            >Here's what I did:
            >>
            >#include <stdio.h>
            >#include <string.h>
            >#define MAX 80
            >>
            >int main()
            >{
            > char s[MAX];
            > int i, j;
            > fgets(s, MAX, stdin);
            > i=strlen(s);
            > while(i)
            > {
            > while (s[--i]!=' ' && i>0) /*Find the last space*/
            > ;
            > j=i;
            > while (s[--j]==' ' && j>0) /*Go to the last non-space*/
            > ; /*char before s[i]*/
            >>
            > if (s[j]!=' ')
            > j++; /*Increment j so that s[j] is a space*/
            >>
            > if (j<i) /*If extra spaces have been found, remove*/
            > while (s[i]) /*them by left shifting */
            > s[++j]=s[++i]; /*the characters on the right*/
            >>
            > i=j;
            > }
            > puts(s);
            >>
            > return 0;
            >}
            >>
            >The program works fine, but I have a feeling that I've made it
            >unnecessaril y complicated.
            >>
            >Can anyone suggest ways on which I can improve upon the code? Is there
            >a better algorithm?
            Try this. Notice the absence of string buffers. Should work until
            you get over 32767 consecutive blanks.
            #include <stdio.h>
            int main(void)
            {
            int blanks, ch;
            blanks = 0;
            while (EOF != (ch = getchar())) {
            if (' ' == ch) {
            ++blanks;
            if (1 == blanks) putchar(' ');
            }
            else {
            putchar(ch);
            blanks = 0;
            }
            }
            return 0;
            }
            >
            Or maybe..

            #include <stdio.h>
            int main(void) {
            int ch, last = 0;
            while ((ch = getchar()) != EOF) {
            if (!(ch == ' ' && last == ch))
            putchar(ch);
            last = ch;
            }
            return 0;
            }
            >
            The problem is that I think the OP was only using fgets to get a sample
            string - it is therefore not the excercise to simplify the algorithm
            using getchar() or whatever.
            >
            His spec was to remove excess spaces from a string.
            >
            Yes, that's what I want to do: remove excess spaces from a given string.

            Comment

            • Andrew Poelstra

              #7
              Re: Remove extra blanks

              On Sun, 2006-10-15 at 04:22 -0700, Registered User wrote:
              Hi experts,
              I'm trying to write a program that replaces two or more consecutive
              blanks in a string by a single blank.
              >
              Here's what I did:
              >
              #include <stdio.h>
              #include <string.h>
              #define MAX 80
              >
              int main()
              {
              char s[MAX];
              int i, j;
              fgets(s, MAX, stdin);
              i=strlen(s);
              while(i)
              {
              while (s[--i]!=' ' && i>0) /*Find the last space*/
              ;
              j=i;
              while (s[--j]==' ' && j>0) /*Go to the last non-space*/
              ; /*char before s[i]*/
              >
              if (s[j]!=' ')
              j++; /*Increment j so that s[j] is a space*/
              >
              if (j<i) /*If extra spaces have been found, remove*/
              while (s[i]) /*them by left shifting */
              s[++j]=s[++i]; /*the characters on the right*/
              >
              i=j;
              }
              puts(s);
              >
              return 0;
              }
              >
              The program works fine, but I have a feeling that I've made it
              unnecessarily complicated.
              >
              Well, use spaces instead of tabs. I've replaced yours with two-space
              indents. (On USENET, tabs can be filtered out or displayed incorrectly.)
              >
              Can anyone suggest ways on which I can improve upon the code? Is there
              a better algorithm?
              >
              It'd be better to use two strings, an input and an output. That way, you
              can make a function that accepts string literals. (String literals are
              non-mutable, in case you didn't know.)

              If you use two strings, you can simply copy each character until you hit
              a space. Then, copy a space, skip to the next non-whitespace character,
              and continue as you were.

              --
              Andrew Poelstra <http://www.wpsoftware. net/projects/>

              Comment

              • lovecreatesbea...@gmail.com

                #8
                Re: Remove extra blanks


                Registered User wrote:
                Hi experts,
                I'm trying to write a program that replaces two or more consecutive
                blanks in a string by a single blank.
                >
                Here's what I did:
                >
                #include <stdio.h>
                #include <string.h>
                #define MAX 80
                >
                int main()
                {
                char s[MAX];
                int i, j;
                fgets(s, MAX, stdin);
                i=strlen(s);
                while(i)
                {
                while (s[--i]!=' ' && i>0) /*Find the last space*/
                ;
                j=i;
                while (s[--j]==' ' && j>0) /*Go to the last non-space*/
                ; /*char before s[i]*/
                >
                if (s[j]!=' ')
                j++; /*Increment j so that s[j] is a space*/
                >
                if (j<i) /*If extra spaces have been found, remove*/
                while (s[i]) /*them by left shifting */
                s[++j]=s[++i]; /*the characters on the right*/
                >
                i=j;
                }
                puts(s);
                >
                return 0;
                }
                >
                The program works fine, but I have a feeling that I've made it
                unnecessarily complicated.
                >
                >
                Can anyone suggest ways on which I can improve upon the code? Is there
                a better algorithm?
                just as an alternative,

                /*removes extra blanks from a string, replaces two or more consecutive
                blanks in a string by a single space.*/
                int sglspc(char *s){
                int n;
                char *p, *p2;

                n = 0;
                p = s;

                while (*p){
                if (*p == ' ' && *(p + 1) == *p){
                n++;
                p2 = p;

                while (*p2){
                *p2 = *(p2 + 1);
                p2++;
                }
                } else
                p++;
                }

                return n;
                }

                #include <stdio.h>
                #include <string.h>
                int main(void){
                char s[] = " hello world ";
                int n;

                printf("%s, %d\n", s, strlen(s));
                n = sglspc(s);
                printf("%s, %d, (-%d)\n", s, strlen(s), n);

                return 0;
                }

                $ a.out
                hello world , 27
                hello world , 13, (-14)

                $

                Comment

                • Richard

                  #9
                  Re: Remove extra blanks

                  Richard <rgrdev@gmail.c omwrites:
                  "Registered User" <invalidinvalid invalid@gmail.c omwrites:
                  >
                  >Hi experts,
                  >I'm trying to write a program that replaces two or more consecutive
                  >blanks in a string by a single blank.
                  >>
                  >Here's what I did:
                  >>
                  >#include <stdio.h>
                  >#include <string.h>
                  >#define MAX 80
                  >>
                  >int main()
                  >{
                  > char s[MAX];
                  > int i, j;
                  > fgets(s, MAX, stdin);
                  > i=strlen(s);
                  > while(i)
                  > {
                  > while (s[--i]!=' ' && i>0) /*Find the last space*/
                  > ;
                  > j=i;
                  > while (s[--j]==' ' && j>0) /*Go to the last non-space*/
                  > ; /*char before s[i]*/
                  >>
                  > if (s[j]!=' ')
                  > j++; /*Increment j so that s[j] is a space*/
                  >>
                  > if (j<i) /*If extra spaces have been found, remove*/
                  > while (s[i]) /*them by left shifting */
                  > s[++j]=s[++i]; /*the characters on the right*/
                  >>
                  > i=j;
                  > }
                  > puts(s);
                  >>
                  > return 0;
                  >}
                  >>
                  >The program works fine, but I have a feeling that I've made it
                  >unnecessaril y complicated.
                  >>
                  >>
                  >Can anyone suggest ways on which I can improve upon the code? Is there
                  >a better algorithm?
                  >>
                  >
                  Much faster & efficient IMO (in most cases I would think) to
                  malloc a new string, copy the original one into it and then update the
                  original in place - no repeated shuffling.
                  >
                  strcpy(refCopy, refStr)
                  char *d=refStr; /*destination*/
                  char *s=refCopy; /*original string copy - source*/
                  while(*d++=(ch= *s++))
                  if(ch==' '){
                  while((ch=*s++) &&(ch==' ')); /*gobble up following spaces
                  if (!(*d++=ch)) /* store first non space */
                  break;
                  }
                  >
                  Not tested, but you will get the idea.
                  >
                  Idiocy alert : you dont even need the copy thus saving fannying around
                  with mallocs etc. Just set s to be d. This is fine since s is always
                  the same or, after the first double space, ahead of the destination pointer.

                  Whoops.


                  --

                  Comment

                  • jacob navia

                    #10
                    Re: Remove extra blanks

                    The strtrim function from the lcc-win32 compiler looks like this:
                    #include <ctype.h>
                    int strtrim(char *str)
                    {
                    char *src = str,*dst = str,*start = str;

                    while (isspace(*src)) // Skip leading spaces
                    src++;
                    do {
                    // Copy non space chars
                    while (*src && !isspace(*src))
                    *dst++ = *src++;
                    // Here we have either zero or a space
                    if (*src) {
                    *dst++ = *src++; // Copy first space
                    while (isspace(*src) && // Skip the rest
                    *src != '\n' && *src != '\r')
                    src++;
                    }
                    } while (*src);
                    // If the last character before a newline is space, delete it.
                    if (dst != start && isspace(dst[-1]) && dst[-1] != '\n')
                    dst--;
                    *dst = 0;
                    return dst - src;
                    }

                    Comment

                    • free4trample@yahoo.com

                      #11
                      Re: Remove extra blanks

                      This si as simple as it gets, i think...
                      Problem with this code is that it adds a SPACE character at the end of
                      a file.

                      =============== =====Start paste========== =============
                      #include<stdio. h>
                      #include<string .h>
                      #define MAX_LINE_LENGHT H 200
                      #define MAX_FN_LENGTH 20

                      int main(void){
                      char filein[MAX_FN_LENGTH], fileout[MAX_FN_LENGTH],
                      s1[MAX_LINE_LENGHT H], *s2;
                      FILE *ff1, *ff2;

                      printf("Enter input file: ");
                      scanf("%s",file in);
                      printf("\nEnter output file: ");
                      scanf("%s",file out);
                      ff1=fopen(filei n,"r");
                      ff2=fopen(fileo ut,"w");

                      while(!feof(ff1 )){
                      fgets(s1,MAX_LI NE_LENGHTH,ff1) ;
                      s2=strtok(s1," ");
                      fprintf(ff2,"%s ",s2);
                      while((s2=strto k('\0'," "))!=NULL){
                      if(s2[strlen(s2)-1]!='\n')
                      fprintf(ff2,"%s ",s2);
                      else
                      fprintf(ff2,"%s ",s2);
                      }
                      }

                      fclose(ff1);
                      fclose(ff2);
                      return 0;
                      }
                      =============== ====End Paste========== =======

                      Comment

                      • Registered User

                        #12
                        Re: Remove extra blanks

                        Richard wrote:
                        Richard <rgrdev@gmail.c omwrites:
                        >
                        "Registered User" <invalidinvalid invalid@gmail.c omwrites:
                        Hi experts,
                        I'm trying to write a program that replaces two or more consecutive
                        blanks in a string by a single blank.
                        >
                        Here's what I did:
                        >
                        #include <stdio.h>
                        #include <string.h>
                        #define MAX 80
                        >
                        int main()
                        {
                        char s[MAX];
                        int i, j;
                        fgets(s, MAX, stdin);
                        i=strlen(s);
                        while(i)
                        {
                        while (s[--i]!=' ' && i>0) /*Find the last space*/
                        ;
                        j=i;
                        while (s[--j]==' ' && j>0) /*Go to the last non-space*/
                        ; /*char before s[i]*/
                        >
                        if (s[j]!=' ')
                        j++; /*Increment j so that s[j] is a space*/
                        >
                        if (j<i) /*If extra spaces have been found, remove*/
                        while (s[i]) /*them by left shifting */
                        s[++j]=s[++i]; /*the characters on the right*/
                        >
                        i=j;
                        }
                        puts(s);
                        >
                        return 0;
                        }
                        >
                        The program works fine, but I have a feeling that I've made it
                        unnecessarily complicated.
                        >
                        >
                        Can anyone suggest ways on which I can improve upon the code? Is there
                        a better algorithm?
                        >
                        Much faster & efficient IMO (in most cases I would think) to
                        malloc a new string, copy the original one into it and then update the
                        original in place - no repeated shuffling.

                        strcpy(refCopy, refStr)
                        char *d=refStr; /*destination*/
                        char *s=refCopy; /*original string copy - source*/
                        while(*d++=(ch= *s++))
                        if(ch==' '){
                        while((ch=*s++) &&(ch==' ')); /*gobble up following spaces
                        if (!(*d++=ch)) /* store first non space */
                        break;
                        }

                        Not tested, but you will get the idea.
                        Thanks for the idea, Richard. I've implemented something similar:

                        #include <stdio.h>
                        #define MAX 80
                        int main()
                        {
                        char s[MAX];
                        int i, j;
                        fgets(s, MAX, stdin);
                        i=j=0;
                        while(s[i++]=s[j++])
                        {
                        if (s[i-1]==' ') /*If the last character copied was a space*/
                        {
                        while (s[j++]==' ') /*gobble up following spaces */
                        ;
                        if ((s[i++]=s[j-1])=='\0')
                        break;
                        }
                        }
                        puts(s);
                        return 0;
                        }
                        >
                        Idiocy alert : you dont even need the copy thus saving fannying around
                        with mallocs etc. Just set s to be d. This is fine since s is always
                        the same or, after the first double space, ahead of the destination pointer.
                        >
                        Whoops.
                        Yeah, that was funny.

                        Comment

                        • free4trample@yahoo.com

                          #13
                          Re: Remove extra blanks

                          Actually made the body of my lst post too complex, here is the bug
                          free, simpler version.

                          =============== ====Start paste========== =====
                          #include<stdio. h>
                          #include<string .h>
                          #define MAX_LINE_LENGHT H 200
                          #define MAX_FN_LENGTH 20

                          int main(void){
                          char filein[MAX_FN_LENGTH], fileout[MAX_FN_LENGTH],
                          s1[MAX_LINE_LENGHT H], *s2;
                          FILE *ff1, *ff2;

                          printf("Enter input file: ");
                          scanf("%s",file in);
                          printf("\nEnter output file: ");
                          scanf("%s",file out);
                          ff1=fopen(filei n,"r");
                          ff2=fopen(fileo ut,"w");

                          while(!feof(ff1 )){
                          fgets(s1,MAX_LI NE_LENGHTH,ff1) ;
                          s2=strtok(s1," ");
                          fprintf(ff2,"%s ",s2);
                          while((s2=strto k('\0'," "))!=NULL){
                          fprintf(ff2," %s",s2);
                          }
                          }

                          fclose(ff1);
                          fclose(ff2);
                          return 0;
                          }
                          =============== ==End Paste========== ==========

                          This one has no bugs either.

                          Comment

                          • Richard Heathfield

                            #14
                            Re: Remove extra blanks

                            free4trample@ya hoo.com said:
                            This si as simple as it gets, i think...
                            Problem with this code is that it adds a SPACE character at the end of
                            a file.
                            >
                            =============== =====Start paste========== =============
                            #include<stdio. h>
                            #include<string .h>
                            #define MAX_LINE_LENGHT H 200
                            #define MAX_FN_LENGTH 20
                            >
                            int main(void){
                            char filein[MAX_FN_LENGTH], fileout[MAX_FN_LENGTH],
                            s1[MAX_LINE_LENGHT H], *s2;
                            FILE *ff1, *ff2;
                            >
                            printf("Enter input file: ");
                            scanf("%s",file in);
                            ThisIsWhatIType InResponseToYou rInputRequest. That's mischievous, but not
                            malicious. If you use "%s" with scanf, you open yourself up to malice as
                            well as mischief.

                            printf("\nEnter output file: ");
                            scanf("%s",file out);
                            Same applies.
                            ff1=fopen(filei n,"r");
                            ff2=fopen(fileo ut,"w");
                            What if these operations fail?
                            >
                            while(!feof(ff1 )){
                            fgets(s1,MAX_LI NE_LENGHTH,ff1) ;
                            This code will process the last line twice. Instead, use:

                            while(fgets(s1, MAX_LINE_LENGHT H, ff1) != NULL)
                            {

                            or better still:

                            while(fgets(s1, sizeof s1, ff1) != NULL)
                            {

                            --
                            Richard Heathfield
                            "Usenet is a strange place" - dmr 29/7/1999

                            email: rjh at above domain (but drop the www, obviously)

                            Comment

                            • Thad Smith

                              #15
                              Re: Remove extra blanks

                              lovecreatesbea. ..@gmail.com wrote:
                              Registered User wrote:
                              >
                              >>Hi experts,
                              >>I'm trying to write a program that replaces two or more consecutive
                              >>blanks in a string by a single blank.
                              >
                              just as an alternative,
                              >
                              /*removes extra blanks from a string, replaces two or more consecutive
                              blanks in a string by a single space.*/
                              int sglspc(char *s){
                              int n;
                              char *p, *p2;
                              >
                              n = 0;
                              p = s;
                              >
                              while (*p){
                              if (*p == ' ' && *(p + 1) == *p){
                              n++;
                              p2 = p;
                              >
                              while (*p2){
                              *p2 = *(p2 + 1);
                              p2++;
                              }
                              } else
                              p++;
                              }
                              >
                              return n;
                              }
                              >
                              #include <stdio.h>
                              #include <string.h>
                              int main(void){
                              char s[] = " hello world ";
                              int n;
                              >
                              printf("%s, %d\n", s, strlen(s));
                              n = sglspc(s);
                              printf("%s, %d, (-%d)\n", s, strlen(s), n);
                              >
                              return 0;
                              }
                              int sglspc(char *s){
                              int n = 0;
                              char *d = s;
                              while (*d++ = *s)
                              while (*s++ == ' ' && *s == ' ') n++;
                              return n;
                              }

                              As part of a real program, it would be longer.

                              --
                              Thad

                              Comment

                              Working...