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. Problem using strings

Problem using strings

Scheduled Pinned Locked Moved C / C++ / MFC
helpasp-netcomquestion
18 Posts 11 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.
  • R Rodrigo Lourenco

    I'm trying to change a given string in a function, but I send a string, try to change it directly and get a core dump, so I tried to create a string in the function, but it doesn't send the correct string. This function must eliminate all Capital letter's it's a simple one, but I am making a mistake and don't see where. Can any one help me please.

    #include #include #include #include #define false 1
    #define true 0

    char* my_strdelupper(char* s){

      int i,j, len;
      char aux\[100\];
      char debuging;
    
      len = strlen(s);
      j = 0;
      for (i = 0; \*(s + i) != '\\0' < len; i++){
          if (!isupper(\*(s+i))){
              printf("%c",\*(s+i));
              debuging = \*(s + i);
              \*(aux + j) = debuging;
             j++;
          }
      }
      \*(aux + j) = '\\0';
      printf("\\n");
      puts(aux);
    
      return strcpy(aux, aux);
    

    }

    int main()
    {
    char *s3="Quem quer casar com um programador?";
    printf("%s\n",my_strdelupper(s3)); /* aria, sabes que é s o meu "rande mor " */

    return 0;
    }

    J Offline
    J Offline
    Joe Woodbury
    wrote on last edited by
    #5

    This line of code puzzles me:

    *(s + i) != '\0' < len

    It probably should be:

    i < len

    A second problem is that you are doing the copy only on !isupper, when you should be doing it always as soon as an uppercase character is detected. A third problem is the strcpy() at the end. It's pointless. A fourth problem is that you are returning a pointer to the a stack value which becomes invalid because the call to printf is likely overwriting it and is likely causing a fault.

    R 1 Reply Last reply
    0
    • R Rodrigo Lourenco

      I'm trying to change a given string in a function, but I send a string, try to change it directly and get a core dump, so I tried to create a string in the function, but it doesn't send the correct string. This function must eliminate all Capital letter's it's a simple one, but I am making a mistake and don't see where. Can any one help me please.

      #include #include #include #include #define false 1
      #define true 0

      char* my_strdelupper(char* s){

        int i,j, len;
        char aux\[100\];
        char debuging;
      
        len = strlen(s);
        j = 0;
        for (i = 0; \*(s + i) != '\\0' < len; i++){
            if (!isupper(\*(s+i))){
                printf("%c",\*(s+i));
                debuging = \*(s + i);
                \*(aux + j) = debuging;
               j++;
            }
        }
        \*(aux + j) = '\\0';
        printf("\\n");
        puts(aux);
      
        return strcpy(aux, aux);
      

      }

      int main()
      {
      char *s3="Quem quer casar com um programador?";
      printf("%s\n",my_strdelupper(s3)); /* aria, sabes que é s o meu "rande mor " */

      return 0;
      }

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

      Try this:

      char* my_strdelupper(char* s){
      int i, len;
      char* sl;

      len = strlen(s);
      sl = (char\*)malloc(len+1); // space for the converted string
      i = 0; // index to the converted string buffer
      while (\*s != '\\0'){
          if (!isupper(\*s)){
              sl\[i++\] = \*s; // copy lower case letters
          }
          s++;
      }
      sl\[i\] = '\\0';
      printf("%s\\n", sl);
      
      return sl;
      

      }

      R 1 Reply Last reply
      0
      • V Victor Nijegorodov

        Why not using the std::string with all its and other std methods? :zzz: :confused:

        R Offline
        R Offline
        Rodrigo Lourenco
        wrote on last edited by
        #7

        I'm working with C

        1 Reply Last reply
        0
        • J Joe Woodbury

          This line of code puzzles me:

          *(s + i) != '\0' < len

          It probably should be:

          i < len

          A second problem is that you are doing the copy only on !isupper, when you should be doing it always as soon as an uppercase character is detected. A third problem is the strcpy() at the end. It's pointless. A fourth problem is that you are returning a pointer to the a stack value which becomes invalid because the call to printf is likely overwriting it and is likely causing a fault.

          R Offline
          R Offline
          Rodrigo Lourenco
          wrote on last edited by
          #8

          You are correct, that was one mistake, but it should be *(s + i) != '\0' because I am searching for the end of line.

          1 Reply Last reply
          0
          • L Lost User

            Try this:

            char* my_strdelupper(char* s){
            int i, len;
            char* sl;

            len = strlen(s);
            sl = (char\*)malloc(len+1); // space for the converted string
            i = 0; // index to the converted string buffer
            while (\*s != '\\0'){
                if (!isupper(\*s)){
                    sl\[i++\] = \*s; // copy lower case letters
                }
                s++;
            }
            sl\[i\] = '\\0';
            printf("%s\\n", sl);
            
            return sl;
            

            }

            R Offline
            R Offline
            Rodrigo Lourenco
            wrote on last edited by
            #9

            The stupid thing is that I can't use malloc, so I made a char array with fixed size to overcame that problem.

            1 Reply Last reply
            0
            • D David Crow

              If I were to hazard a guess, I'd say it has to do with aux being destroyed (i.e., going out of scope) once my_strdelupper() returns.

              "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

              R Offline
              R Offline
              Rodrigo Lourenco
              wrote on last edited by
              #10

              I think you are correct, but I tried to copy aux to s and didn't work, now I changed the code to send an array, them befour I leave I copy using srtcpy aux to s, and it's working.

              1 Reply Last reply
              0
              • K k5054

                You have: char *s3 = "...". Although s3 is declared as char * the type of the string is const char *. Use char s3[] = "..." instead.

                R Offline
                R Offline
                Rodrigo Lourenco
                wrote on last edited by
                #11

                It worked thanks

                1 Reply Last reply
                0
                • R Rodrigo Lourenco

                  I'm trying to change a given string in a function, but I send a string, try to change it directly and get a core dump, so I tried to create a string in the function, but it doesn't send the correct string. This function must eliminate all Capital letter's it's a simple one, but I am making a mistake and don't see where. Can any one help me please.

                  #include #include #include #include #define false 1
                  #define true 0

                  char* my_strdelupper(char* s){

                    int i,j, len;
                    char aux\[100\];
                    char debuging;
                  
                    len = strlen(s);
                    j = 0;
                    for (i = 0; \*(s + i) != '\\0' < len; i++){
                        if (!isupper(\*(s+i))){
                            printf("%c",\*(s+i));
                            debuging = \*(s + i);
                            \*(aux + j) = debuging;
                           j++;
                        }
                    }
                    \*(aux + j) = '\\0';
                    printf("\\n");
                    puts(aux);
                  
                    return strcpy(aux, aux);
                  

                  }

                  int main()
                  {
                  char *s3="Quem quer casar com um programador?";
                  printf("%s\n",my_strdelupper(s3)); /* aria, sabes que é s o meu "rande mor " */

                  return 0;
                  }

                  R Offline
                  R Offline
                  Rodrigo Lourenco
                  wrote on last edited by
                  #12

                  Thank you, for all, it was a great help. The problem was solved by:

                  #include #include #include #include #define false 1
                  #define true 0

                  char* my_strdelupper(char* s){

                    int i,j, len;
                    char aux\[100\];
                    char debuging;
                  
                    len = strlen(s);
                    j = 0;
                    for (i = 0; \*(s + i) != '\\0'; i++){
                        if (!isupper(\*(s+i))){
                            debuging = \*(s + i);
                            \*(aux + j) = debuging;
                           j++;
                        }
                    }
                    \*(aux + j) = '\\0';
                  
                    strcpy(s, aux);
                    return s;
                  

                  }

                  int main()
                  {
                  char s3[]="Maria, TU sabes que TU éS o meu \"Grande Amor\"";
                  printf("%s\n",my_strdelupper(&s3[0])); /* aria, sabes que é s o meu "rande mor " */

                  return 0;
                  }

                  J CPalliniC 2 Replies Last reply
                  0
                  • R Rodrigo Lourenco

                    Thank you, for all, it was a great help. The problem was solved by:

                    #include #include #include #include #define false 1
                    #define true 0

                    char* my_strdelupper(char* s){

                      int i,j, len;
                      char aux\[100\];
                      char debuging;
                    
                      len = strlen(s);
                      j = 0;
                      for (i = 0; \*(s + i) != '\\0'; i++){
                          if (!isupper(\*(s+i))){
                              debuging = \*(s + i);
                              \*(aux + j) = debuging;
                             j++;
                          }
                      }
                      \*(aux + j) = '\\0';
                    
                      strcpy(s, aux);
                      return s;
                    

                    }

                    int main()
                    {
                    char s3[]="Maria, TU sabes que TU éS o meu \"Grande Amor\"";
                    printf("%s\n",my_strdelupper(&s3[0])); /* aria, sabes que é s o meu "rande mor " */

                    return 0;
                    }

                    J Offline
                    J Offline
                    jschell
                    wrote on last edited by
                    #13

                    As a note - you define 'len' but you don't use it. Presumably the assignment does not say otherwise, using that would make your code simpler.

                    1 Reply Last reply
                    0
                    • R Rodrigo Lourenco

                      Thank you, for all, it was a great help. The problem was solved by:

                      #include #include #include #include #define false 1
                      #define true 0

                      char* my_strdelupper(char* s){

                        int i,j, len;
                        char aux\[100\];
                        char debuging;
                      
                        len = strlen(s);
                        j = 0;
                        for (i = 0; \*(s + i) != '\\0'; i++){
                            if (!isupper(\*(s+i))){
                                debuging = \*(s + i);
                                \*(aux + j) = debuging;
                               j++;
                            }
                        }
                        \*(aux + j) = '\\0';
                      
                        strcpy(s, aux);
                        return s;
                      

                      }

                      int main()
                      {
                      char s3[]="Maria, TU sabes que TU éS o meu \"Grande Amor\"";
                      printf("%s\n",my_strdelupper(&s3[0])); /* aria, sabes que é s o meu "rande mor " */

                      return 0;
                      }

                      CPalliniC Offline
                      CPalliniC Offline
                      CPallini
                      wrote on last edited by
                      #14

                      Note you don't need extra storage, the function may change the string in place:

                      char * remove_upper( char * s)
                      {
                      char * p, *q;

                      for (p = q = s; *p != '\0'; ++p)
                      if ( ! isupper(*p) )
                      *q++ = *p;

                      *q = '\0';
                      return s;
                      }

                      In testa che avete, signor di Ceprano?

                      P J 2 Replies Last reply
                      0
                      • CPalliniC CPallini

                        Note you don't need extra storage, the function may change the string in place:

                        char * remove_upper( char * s)
                        {
                        char * p, *q;

                        for (p = q = s; *p != '\0'; ++p)
                        if ( ! isupper(*p) )
                        *q++ = *p;

                        *q = '\0';
                        return s;
                        }

                        P Offline
                        P Offline
                        Peter_in_2780
                        wrote on last edited by
                        #15

                        Taken from K&R 1st ed? Certainly has that feel> :laugh: ;P

                        Software rusts. Simon Stephenson, ca 1994. So does this signature. me, 2012

                        CPalliniC 1 Reply Last reply
                        0
                        • P Peter_in_2780

                          Taken from K&R 1st ed? Certainly has that feel> :laugh: ;P

                          Software rusts. Simon Stephenson, ca 1994. So does this signature. me, 2012

                          CPalliniC Offline
                          CPalliniC Offline
                          CPallini
                          wrote on last edited by
                          #16

                          It is the Wonderful C programming language, of course has such a feel. In any case, were Dennis and Brian the ones who plagiarized my programs. :-D

                          In testa che avete, signor di Ceprano?

                          1 Reply Last reply
                          0
                          • V Victor Nijegorodov

                            Why not using the std::string with all its and other std methods? :zzz: :confused:

                            M Offline
                            M Offline
                            Member_14494321
                            wrote on last edited by
                            #17

                            As I have not clear idea about the std but yes this library used in most of the cases. [Fixed] Dell Printer Error 016 302 | Error Code 0x[^] helped me to get the solution.

                            1 Reply Last reply
                            0
                            • CPalliniC CPallini

                              Note you don't need extra storage, the function may change the string in place:

                              char * remove_upper( char * s)
                              {
                              char * p, *q;

                              for (p = q = s; *p != '\0'; ++p)
                              if ( ! isupper(*p) )
                              *q++ = *p;

                              *q = '\0';
                              return s;
                              }

                              J Offline
                              J Offline
                              John R Shaw
                              wrote on last edited by
                              #18

                              I was begging to think no one here was thinking. Thanks

                              INTP "Program testing can be used to show the presence of bugs, but never to show their absence." - Edsger Dijkstra "I have never been lost, but I will admit to being confused for several weeks. " - Daniel Boone

                              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