Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. To make a function in C which does not except "\n" & EOF as input.

To make a function in C which does not except "\n" & EOF as input.

Scheduled Pinned Locked Moved C / C++ / MFC
collaborationregexhelp
15 Posts 4 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • T Offline
    T Offline
    Tarun Jha
    wrote on last edited by
    #1

    I have been practicing structures and function and while making a program that does not accept '\n' and EOF as input. Below is the program, it takes input but the compiler does not shows any error.

    #include
    #include

    typedef struct
    {
    char name[100];
    int goals;

    }match;

    match check();

    int main()
    {
    int log;
    match team;

    scanf("%d", &log);
    
    printf("Enter goals:\\n");
    scanf("%d", team.goals);
    
    fflush(stdin);
    team = check();
    printf("Name: %s\\t\\tGoals: %d\\n", team.name, team.goals);
    
    return 0;
    

    }

    match check()
    {
    int c;
    match temp;

    gets(temp.name);
    if((c=temp.name\[0\])==EOF && c == '\\n')
    {
    	printf("Invalid entry!");
    	check(temp);
    }
    
    return(temp);
    

    }

    D L L 3 Replies Last reply
    0
    • T Tarun Jha

      I have been practicing structures and function and while making a program that does not accept '\n' and EOF as input. Below is the program, it takes input but the compiler does not shows any error.

      #include
      #include

      typedef struct
      {
      char name[100];
      int goals;

      }match;

      match check();

      int main()
      {
      int log;
      match team;

      scanf("%d", &log);
      
      printf("Enter goals:\\n");
      scanf("%d", team.goals);
      
      fflush(stdin);
      team = check();
      printf("Name: %s\\t\\tGoals: %d\\n", team.name, team.goals);
      
      return 0;
      

      }

      match check()
      {
      int c;
      match temp;

      gets(temp.name);
      if((c=temp.name\[0\])==EOF && c == '\\n')
      {
      	printf("Invalid entry!");
      	check(temp);
      }
      
      return(temp);
      

      }

      D Offline
      D Offline
      David Crow
      wrote on last edited by
      #2

      Tarun Jha wrote:

      if((c=temp.name[0])==EOF && c == '\n')

      I'm not sure how a character retrieved from gets() could ever be equal to -1, but that issue aside, I do not believe that the variable c can be equal to both EOF (or any other value) and \n at the same time. Another issue with gets() is buffer overflow.

      "One man's wage rise is another man's price increase." - Harold Wilson

      "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

      "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

      T 1 Reply Last reply
      0
      • T Tarun Jha

        I have been practicing structures and function and while making a program that does not accept '\n' and EOF as input. Below is the program, it takes input but the compiler does not shows any error.

        #include
        #include

        typedef struct
        {
        char name[100];
        int goals;

        }match;

        match check();

        int main()
        {
        int log;
        match team;

        scanf("%d", &log);
        
        printf("Enter goals:\\n");
        scanf("%d", team.goals);
        
        fflush(stdin);
        team = check();
        printf("Name: %s\\t\\tGoals: %d\\n", team.name, team.goals);
        
        return 0;
        

        }

        match check()
        {
        int c;
        match temp;

        gets(temp.name);
        if((c=temp.name\[0\])==EOF && c == '\\n')
        {
        	printf("Invalid entry!");
        	check(temp);
        }
        
        return(temp);
        

        }

        L Offline
        L Offline
        Lost User
        wrote on last edited by
        #3

        Once again, I suggest you make proper use of the documentation: gets, _getws | Microsoft Docs[^].

        1 Reply Last reply
        0
        • T Tarun Jha

          I have been practicing structures and function and while making a program that does not accept '\n' and EOF as input. Below is the program, it takes input but the compiler does not shows any error.

          #include
          #include

          typedef struct
          {
          char name[100];
          int goals;

          }match;

          match check();

          int main()
          {
          int log;
          match team;

          scanf("%d", &log);
          
          printf("Enter goals:\\n");
          scanf("%d", team.goals);
          
          fflush(stdin);
          team = check();
          printf("Name: %s\\t\\tGoals: %d\\n", team.name, team.goals);
          
          return 0;
          

          }

          match check()
          {
          int c;
          match temp;

          gets(temp.name);
          if((c=temp.name\[0\])==EOF && c == '\\n')
          {
          	printf("Invalid entry!");
          	check(temp);
          }
          
          return(temp);
          

          }

          L Offline
          L Offline
          leon de boer
          wrote on last edited by
          #4

          Read what David Crow said and then realize name is a char array .. that is 8 bits You move it to an int with c=temp.name[0] but that will be a truncated 8 bit value. That is comparing it to EOF which is an int value will always fail. That is what Richard is trying to tell you. You probably want name as an array of int or wide chars. So you have 2 problems and which have both been identified and you need to deal with both. I am just making sure you realize BOTH comments are valid and address different issues.

          In vino veritas

          T 1 Reply Last reply
          0
          • L leon de boer

            Read what David Crow said and then realize name is a char array .. that is 8 bits You move it to an int with c=temp.name[0] but that will be a truncated 8 bit value. That is comparing it to EOF which is an int value will always fail. That is what Richard is trying to tell you. You probably want name as an array of int or wide chars. So you have 2 problems and which have both been identified and you need to deal with both. I am just making sure you realize BOTH comments are valid and address different issues.

            In vino veritas

            T Offline
            T Offline
            Tarun Jha
            wrote on last edited by
            #5

            i searched on net but didn't got the concept of how it should be corrected. can you tell me how to correct it ?

            D 1 Reply Last reply
            0
            • D David Crow

              Tarun Jha wrote:

              if((c=temp.name[0])==EOF && c == '\n')

              I'm not sure how a character retrieved from gets() could ever be equal to -1, but that issue aside, I do not believe that the variable c can be equal to both EOF (or any other value) and \n at the same time. Another issue with gets() is buffer overflow.

              "One man's wage rise is another man's price increase." - Harold Wilson

              "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

              "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

              T Offline
              T Offline
              Tarun Jha
              wrote on last edited by
              #6

              But in K&R it's && not ||

              1 Reply Last reply
              0
              • T Tarun Jha

                i searched on net but didn't got the concept of how it should be corrected. can you tell me how to correct it ?

                D Offline
                D Offline
                David Crow
                wrote on last edited by
                #7

                Tarun Jha wrote:

                i searched on net but didn't got the concept...

                So what if the "net" ceased to exist one day? Some things you just have to learn by doing, not by searching.

                "One man's wage rise is another man's price increase." - Harold Wilson

                "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                T 1 Reply Last reply
                0
                • D David Crow

                  Tarun Jha wrote:

                  i searched on net but didn't got the concept...

                  So what if the "net" ceased to exist one day? Some things you just have to learn by doing, not by searching.

                  "One man's wage rise is another man's price increase." - Harold Wilson

                  "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                  "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                  T Offline
                  T Offline
                  Tarun Jha
                  wrote on last edited by
                  #8

                  yes, i tried it many times but am unable to do it correctly. That's why i'am asking for correct answer.

                  D 1 Reply Last reply
                  0
                  • T Tarun Jha

                    yes, i tried it many times but am unable to do it correctly. That's why i'am asking for correct answer.

                    D Offline
                    D Offline
                    David Crow
                    wrote on last edited by
                    #9

                    Tarun Jha wrote:

                    That's why i'am asking for correct answer.

                    Did you try replacing logical AND with OR? Did you try changing c to be a char instead of an int? Did you set a breakpoint on the if() test to see what the value of name[0] is? As the documentation states, it is neither EOF nor \n.

                    "One man's wage rise is another man's price increase." - Harold Wilson

                    "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                    "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                    T 1 Reply Last reply
                    0
                    • D David Crow

                      Tarun Jha wrote:

                      That's why i'am asking for correct answer.

                      Did you try replacing logical AND with OR? Did you try changing c to be a char instead of an int? Did you set a breakpoint on the if() test to see what the value of name[0] is? As the documentation states, it is neither EOF nor \n.

                      "One man's wage rise is another man's price increase." - Harold Wilson

                      "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                      "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                      T Offline
                      T Offline
                      Tarun Jha
                      wrote on last edited by
                      #10

                      yes i did, and it still does'nt works.

                      #include #include typedef struct
                      {
                      char name[100];
                      int goals;

                      }match;

                      match check();

                      int main()
                      {
                      match team, temp;

                      printf("Enter goals:\\n");
                      scanf("%d", &team.goals);
                      
                      fflush(stdin);
                      temp = check();
                      printf("Name: %s\\t\\tGoals: %d\\n", temp.name, team.goals);
                      
                      return 0;
                      

                      }

                      match check()
                      {
                      char c;
                      match temp;

                      printf("Name: \\n");
                      gets(temp.name);
                      
                      if((c=temp.name\[0\])==EOF || c == '\\n')
                      {
                      	printf("Invalid entry!");
                      	check(temp);
                      }
                      
                      return(temp);
                      

                      }

                      D 1 Reply Last reply
                      0
                      • T Tarun Jha

                        yes i did, and it still does'nt works.

                        #include #include typedef struct
                        {
                        char name[100];
                        int goals;

                        }match;

                        match check();

                        int main()
                        {
                        match team, temp;

                        printf("Enter goals:\\n");
                        scanf("%d", &team.goals);
                        
                        fflush(stdin);
                        temp = check();
                        printf("Name: %s\\t\\tGoals: %d\\n", temp.name, team.goals);
                        
                        return 0;
                        

                        }

                        match check()
                        {
                        char c;
                        match temp;

                        printf("Name: \\n");
                        gets(temp.name);
                        
                        if((c=temp.name\[0\])==EOF || c == '\\n')
                        {
                        	printf("Invalid entry!");
                        	check(temp);
                        }
                        
                        return(temp);
                        

                        }

                        D Offline
                        D Offline
                        David Crow
                        wrote on last edited by
                        #11

                        Tarun Jha wrote:

                        check(temp);

                        How does this compile?

                        "One man's wage rise is another man's price increase." - Harold Wilson

                        "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                        "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                        T 1 Reply Last reply
                        0
                        • D David Crow

                          Tarun Jha wrote:

                          check(temp);

                          How does this compile?

                          "One man's wage rise is another man's price increase." - Harold Wilson

                          "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                          "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                          T Offline
                          T Offline
                          Tarun Jha
                          wrote on last edited by
                          #12

                          i corrected that it still doesn't work.

                          #include #include typedef struct
                          {
                          char name[100];
                          int goals;

                          }match;

                          match check();

                          int main()
                          {
                          match team, temp;

                          printf("Enter goals:\\n");
                          scanf("%d", &team.goals);
                          
                          fflush(stdin);
                          temp = check();
                          printf("Name: %s\\t\\tGoals: %d\\n", temp.name, team.goals);
                          
                          return 0;
                          

                          }

                          match check()
                          {
                          char c;
                          match temp;

                          printf("Name: \\n");
                          gets(temp.name);
                          
                          if((c=temp.name\[0\])==EOF || c == '\\n')
                          {
                          	printf("Invalid entry!");
                          	check();
                          }
                          
                          return(temp);
                          

                          }

                          D L L 3 Replies Last reply
                          0
                          • T Tarun Jha

                            i corrected that it still doesn't work.

                            #include #include typedef struct
                            {
                            char name[100];
                            int goals;

                            }match;

                            match check();

                            int main()
                            {
                            match team, temp;

                            printf("Enter goals:\\n");
                            scanf("%d", &team.goals);
                            
                            fflush(stdin);
                            temp = check();
                            printf("Name: %s\\t\\tGoals: %d\\n", temp.name, team.goals);
                            
                            return 0;
                            

                            }

                            match check()
                            {
                            char c;
                            match temp;

                            printf("Name: \\n");
                            gets(temp.name);
                            
                            if((c=temp.name\[0\])==EOF || c == '\\n')
                            {
                            	printf("Invalid entry!");
                            	check();
                            }
                            
                            return(temp);
                            

                            }

                            D Offline
                            D Offline
                            David Crow
                            wrote on last edited by
                            #13

                            Tarun Jha wrote:

                            i corrected that it still doesn't work.

                            My question was not meant to fix your logic error. It was a compiler error. As it stands now, if you were somehow able to detect an invalid entry, a recursive call to check() is made but it would not return anything to the original caller. You'll also need to address this issue.

                            "One man's wage rise is another man's price increase." - Harold Wilson

                            "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                            "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                            1 Reply Last reply
                            0
                            • T Tarun Jha

                              i corrected that it still doesn't work.

                              #include #include typedef struct
                              {
                              char name[100];
                              int goals;

                              }match;

                              match check();

                              int main()
                              {
                              match team, temp;

                              printf("Enter goals:\\n");
                              scanf("%d", &team.goals);
                              
                              fflush(stdin);
                              temp = check();
                              printf("Name: %s\\t\\tGoals: %d\\n", temp.name, team.goals);
                              
                              return 0;
                              

                              }

                              match check()
                              {
                              char c;
                              match temp;

                              printf("Name: \\n");
                              gets(temp.name);
                              
                              if((c=temp.name\[0\])==EOF || c == '\\n')
                              {
                              	printf("Invalid entry!");
                              	check();
                              }
                              
                              return(temp);
                              

                              }

                              L Offline
                              L Offline
                              leon de boer
                              wrote on last edited by
                              #14

                              Richard and I made sure you realized you that you cant use 'gets' ... it's a drop dead. 'gets' only returns chars .. EOF is an int (-1 usually) End-of-file - Wikipedia[^] please look at the difference between 'getc' (returns an int .. yipeee EOF safe) and 'gets' (returns char boo) Then it's not real hard

                              int c;
                              int namelen = 0; // initialize array position index to zero
                              do {
                              c = getc(stdin); // fetch the integer keyboard read value .. EOF safe
                              temp.name[namelen++] = (char) c; // convert the integer to a char and place in array .. increment position
                              } while (c !=EOF && c != '\n'); // repeat until EOF or new line
                              temp.name[namelen-1] = '\0'; // Make C null terminated string (overwrite last EOF or '\n')

                              That should do what you want and I commented what each line does.

                              In vino veritas

                              1 Reply Last reply
                              0
                              • T Tarun Jha

                                i corrected that it still doesn't work.

                                #include #include typedef struct
                                {
                                char name[100];
                                int goals;

                                }match;

                                match check();

                                int main()
                                {
                                match team, temp;

                                printf("Enter goals:\\n");
                                scanf("%d", &team.goals);
                                
                                fflush(stdin);
                                temp = check();
                                printf("Name: %s\\t\\tGoals: %d\\n", temp.name, team.goals);
                                
                                return 0;
                                

                                }

                                match check()
                                {
                                char c;
                                match temp;

                                printf("Name: \\n");
                                gets(temp.name);
                                
                                if((c=temp.name\[0\])==EOF || c == '\\n')
                                {
                                	printf("Invalid entry!");
                                	check();
                                }
                                
                                return(temp);
                                

                                }

                                L Offline
                                L Offline
                                Lost User
                                wrote on last edited by
                                #15

                                I showed you where to find the answer two days ago: read the documentation.

                                1 Reply Last reply
                                0
                                Reply
                                • Reply as topic
                                Log in to reply
                                • Oldest to Newest
                                • Newest to Oldest
                                • Most Votes


                                • Login

                                • Don't have an account? Register

                                • Login or register to search.
                                • First post
                                  Last post
                                0
                                • Categories
                                • Recent
                                • Tags
                                • Popular
                                • World
                                • Users
                                • Groups