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

    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