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 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