strip commas from string

Discussion in 'C++' started by ineedyourluvin1, Jul 30, 2005.

  1. Hello all! I've been looking for a way to strip characters from strings
    such as a comma. This would be great for using a comma
    as a delimiter. I show you what I have right now.


    #include<iostream>
    #include<string>

    int main(int argc, char *argv[])
    {
    using namespace std ;

    char people[14] = "Me,Myself,I" ;
    char nocommas[14] ;
    int i, j ;
    i=j=0 ;





    for(i = 0; i < 14; i++){
    if(people != ',')
    nocommas = people ;

    if(people == ',')
    nocommas = ' ' ;
    }



    cout << "With commas : " << people << endl ;
    cout << "Without commas : " << nocommas << endl ;

    cout << "\n\n\n\n" ;
    cout << "\tNow tell me how I can store each name in a separate
    variable ?" << endl ;
    cout << "\tAnd can someone show me how to do this with string instead
    of char[] ?" << endl ;
    cout << "\t\t Thanks so much!" << endl ;

    return 0 ;
    }


    so as you can see it strips commas and puts a space in its place.

    Thanks for you help :)
     
    ineedyourluvin1, Jul 30, 2005
    #1
    1. Advertisements

  2. Thank you for posting code. This really helps.
    You're not using std::string. So you _may_ not need
    this header.



    1. See std::string class, especially the constructor:
    std::string(char *)
    So that you can use the find() member of the string class.

    2. Also explore the strtok() and strchr() functions in the
    "C" standard library.

    --
    Thomas Matthews

    C++ newsgroup welcome message:
    http://www.slack.net/~shiva/welcome.txt
    C++ Faq: http://www.parashift.com/c++-faq-lite
    C Faq: http://www.eskimo.com/~scs/c-faq/top.html
    alt.comp.lang.learn.c-c++ faq:
    http://www.comeaucomputing.com/learn/faq/
    Other sites:
    http://www.josuttis.com -- C++ STL Library book
    http://www.sgi.com/tech/stl -- Standard Template Library
     
    Thomas Matthews, Jul 30, 2005
    #2
    1. Advertisements

  3. ineedyourluvin1

    Alipha Guest

    Hello all! I've been looking for a way to strip characters from strings
    to store "each name in a separate variable" you'll want a std::vector,
    another container, or perhaps an array.

    to split the string based upon commas, you can put the string in a
    std::stringstream and then use std::getline:

    std::istringstream ss("I,Myself,Me");
    std::string name;
    while(std::getline(ss, name, ',') {
    /* push_back name onto the end of a std::vector or another container
    */
    }
     
    Alipha, Jul 30, 2005
    #3


  4. Here's one possibility:


    #include <iostream>
    #include <sstream>
    #include <string>
    #include <list>

    int main(int argc, char *argv[])
    {
    // the test string of comma-seperated words
    char * people = "Me,Myself,I";

    // make an input stream named 'in' from 'people'
    std::istringstream in(people);

    // 'words' will hold the list of words extracted from 'in'
    std::list< std::string > words;

    // while no error on 'in'
    while(in)
    {
    // 'aWord' will hold the next word read from 'in'
    std::string aWord;

    // get all text from 'in' up to the next comma, or end of data,
    // into 'aWord'
    getline(in, aWord, ',');

    // if no error on 'in', i.e. we read text into 'aWord',
    // then put a copy of 'aWord' in to the 'words' list
    if (in)
    words.push_back(aWord);
    }

    std::cout << "Comma seperated words read from 'people' into the
    'words' list"
    << std::endl;

    // 'it' is an iterator for iterating over the content of the
    // 'words' list
    std::list< std::string >::iterator it;

    // print all of the entries in 'words'
    for (it = words.begin(); it != words.end(); it++)
    std::cout << (*it) << std::endl;

    return 0;
    }

    Regards,
    Larry
     
    Larry I Smith, Jul 30, 2005
    #4
  5. I'm pretty new to C++ myself (I started learning two or three weeks
    ago), so this is probably not the cleanest (or best) way to do this,
    but it works - for me anyway (it compiles with g++ -Wall -ansi -pedantic
    without any warnings, so it should probably work everwhere else, too).

    I stayed pretty close to the code you already had, so you shouldn't have
    any problems understanding it.


    #include <iostream>
    #include <string>
    #include <vector>

    using namespace std;

    int main(int argc, char **argv) {
    string commas="Me,Myself,I";
    if(argv[1]) commas=argv[1]; // Use commandline parameter as string
    // if specified.
    vector<string> nocommas(1);
    int j=0;
    for(unsigned int i=0; i<commas.length(); i++) {
    if(commas==',') { // If the current character is a comma,
    nocommas.push_back(""); // add a new (empty) string to the vector
    j++; // and increase the counter so that all
    // future operations are performed on
    the
    // new string
    }
    else nocommas.at(j)+=commas; // If it's not add the current char
    // to the string with the number j
    // in the vector
    }
    cout<<"With commas: "<<commas<<endl<<endl;
    cout<<"From the array:"<<endl;
    for(int i=0; i<=j; i++) {
    cout<<"Word "<<i<<": "<<nocommas.at(i)<<endl;
    }
    return 0;
    }
     
    Sebastian Hungerecker, Jul 30, 2005
    #5
  6. Larry, why use std:: all the time? You can just put 'using namespace
    std' at the beginning of your code :)
     
    ineedyourluvin1, Jul 30, 2005
    #6
  7. That can get you in trouble.
    In a small program like this it's ok, but it can cause
    unexpected problems in large apps where name conflicts
    might occur with methods from other (3rd party) libs.

    I explicitly use 'std::' in example programs so the reader
    will be clear on where things come from in the example.

    Regards,
    Larry
     
    Larry I Smith, Jul 30, 2005
    #7

  8. For completeness, this line in my example:

    getline(in, aWord, ',');

    should be:

    std::getline(in, aWord, ',');

    In the absence of a "using namespace std;" declaration,
    some compilers will compile the example ok, but some
    will complain about not being able to find the appropriate
    getline() function.

    Regards,
    Larry
     
    Larry I Smith, Jul 30, 2005
    #8

  9. For completeness, this line in my example:

    getline(in, aWord, ',');

    should be:

    std::getline(in, aWord, ',');

    In the absence of a "using namespace std;" declaration,
    some compilers will compile the example ok, but some
    will complain about not being able to find the appropriate
    getline() function.

    Regards,
    Larry
     
    Larry I Smith, Jul 30, 2005
    #9
  10. That can get you in trouble.
    Ok Larry, I see now. You know I learn way more in the news groups
    than I do from a text book ! By the way as far as text books go,
    I'm studying from the Pearson Textbook series , C++ Today and C++
    Primer.
    They're good books but have me starting my progs with using namespace
    and
    sticking with char[] instead of string alot. And to sebastian, Alipha,
    and Thomas ,
    I appreciate your help too ! Larry, I never knew that putting 'Using
    namespace whatever'
    would get me into trouble until you demonstrated it to me in this
    forum. From now
    on I'm going to append std:: to all my std library functions and
    objects.
    I had to say all that to demonstrate my appreciation ... Thanks
     
    ineedyourluvin1, Jul 30, 2005
    #10
  11. The use of 'using namespace std;' versus explicit 'std::' is a decision
    that needs to be made on a project-by-project basis. If you are not
    linking with multiple libs and the project is small, then the 'using'
    declaration is fine. If the project is large and you are linking
    with multiple libs then explicit use of 'std::' might be a better
    option. Most IT departments have some kind of guidelines for their
    developers spelling out the corporation's C++ standards. It just
    happens that my employer expects the use of 'std::' in all but the
    most trivial programs.

    Like anything else, do what makes sense for the particular project.

    Regards,
    Larry
     
    Larry I Smith, Jul 30, 2005
    #11
  12. What do you mean by linking with multiple libs ? You mean like if I
    want to use
    ncurses in a Linux program I would link more than one lib by doing :

    mycomp$> gcc -o ncursesprog ncursesprog.cpp -lncurses

    By putting the -lncurses I would be linking with more than one lib then
    ?
     
    ineedyourluvin1, Jul 30, 2005
    #12
  13. In general, yes -lncurses causes an additional lib to be linked
    in addition to the Std libs that are linked by default.

    Always use 'g++' rather than 'gcc' to compile and link C++
    programs. g++ passes additional info to the linker specific
    to C++ programs (like the list of Std libs to link, etc). e.g.

    g++ -o ncursesprog ncursesprog.cpp -lncurses

    Use 'gcc' for 'C' programs and 'g++' for C++ and mixed
    'C' & C++ programs.

    The newsgroup for GCC 'gcc' is: gnu.gcc.help
    The newsgroup for GCC 'g++' is: gnu.g++.help

    Regards,
    Larry
     
    Larry I Smith, Jul 30, 2005
    #13
  14. What do you mean? Do you think is reasonable in any project to force to use
    a "using namespace std" in all translation units? Or to put in in header
    files? If it is that, I don't think that nobody will agree with that.

    Unless the project is sooooo small that nobody cares about his maintenance,
    of course.
     
    =?ISO-8859-15?Q?Juli=E1n?= Albo, Jul 30, 2005
    #14
  15. No, In fact, we never use 'using namespace std;', but in a very small
    program, like the example code in this thread, it's ok.

    Regards,
    Larry
     
    Larry I Smith, Jul 30, 2005
    #15
  16. So what would be the std libs I can link with ? I mean is there a such
    thing as iostream.lib ? I did a harddrive search and nothing like that
    was found. I would like to know. By the way Larry, I type in the
    example
    program you added to this thread which separated words and used
    the header files sstream and list. Here's the output I got

    Comma separated words read from 'people' into the 'words' list
    me
    myself
    i

    I like the way they list one underneath the other like that . In any
    case I'm
    going to need practice using headers list and sstream. So much to
    learn!

    Sincerelly,

    Me
     
    ineedyourluvin1, Jul 30, 2005
    #16
  17. The Std lib names vary from platform to platform.
    Consult your compiler and Operating System documentation
    for details.

    For example, on my Linux system, the C++ Std lib is:

    libstdc++.so.5.0.

    and is passed to the linker by 'g++' as '-lstdc++'

    It'll be different on Windows, Solaris, HP-UX, AIX, etc.
    Different libs may be linked based on compiler flags:

    compile multi-threaded yes/no
    compile debug yes/no
    use Network sockets yes/no
    etc, etc, etc

    Ask additional question in the newsgroup(s) associated
    with your compiler and Operating System.

    Regards,
    Larry
     
    Larry I Smith, Jul 30, 2005
    #17
  18. If you want to replace commas with spaces simply do:
    std::string s;

    s.replace(s.begin(),s.end(),',',' ');

    if you want ro remove commas use:

    std::string s;

    s.erase(std::remove(s.begin(),s.end(),','),s.end());

    You can use similar code for char* strings.



    /Peter
     
    Peter Koch Larsen, Jul 31, 2005
    #18
  19. Wow that really makes it easy :) Thanks Peter!
     
    ineedyourluvin1, Jul 31, 2005
    #19
  20. ineedyourluvin1

    Ram Guest

    Yes, using std::string functions is the most recommended & convenient
    way. You might find it useful to explore other std::string functions,
    there's one for almost every common task associated with a string.

    Ramashish
     
    Ram, Jul 31, 2005
    #20
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.