简体   繁体   中英

I have made a program in C++ to separate words from a line by spacebar and display those words as an array. What's wrong in my code?

Please help me to find a bug in this program.It separates a line into words by spacebar. And display as a list. If the first char of a word is in lower case, it is converted to uppercase.

#include <iostream>
#include <string>
using namespace std;

int main()
{
    char line[30]="Hi there buddy",List[10][20];
    unsigned int i=0,List_pos=0,no;
    int first=0,last;

    while(i!=sizeof(line)+1)
    {
        if(line[i]==' ' or i==sizeof(line))
        {
            last=i;
            no=0;
            for(int j=first;j<last;++j)
            {
                if(no==0)
                    List[List_pos][no]=toupper(line[j]);
                else
                    List[List_pos][no]=line[j];
                ++no;
            }
            ++List_pos;
            first=last+1;
        }
    ++i;
    }

    for(unsigned int a=0;a<List_pos;++a)
        cout<<"\nList["<<a+1<<"]="<<List[a];

    return 0;
}

Expected Output:

List[1]=Hi    
List[2]=There    
List[3]=Buddy    

Actual Output:

List[1]=Hi    
List[2]=ThereiXŚm    
List[3]=Buddy   

I suggest you use a string, as you already included it. And 'List is not really necessary in this situation. Try making a single for loop where you separate your line into words, in my opinion when you work with arrays you should use for loops. In your for loop, as you go through the line, you could just add a if statement which determines whether you're at the end of a word or not. I think the problem in your code is the multiple loops but I am not sure of it.

I provide you a code which works. Just adapt it to your display requirements and you will be fine

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string line = "Hi there buddy";

    for (int i = 0; i < line.size(); i++) {
        if (line[i] == ' ') {
            line[i + 1] = toupper(line[i+1]);
            cout<<'\n';
        } else {
            cout<<line[i];
        }

    }

    return 0;
} ```

Challenged by the comment from PaulMcKenzie, I implemented a C++ solution with 3 statements:

  1. Define a std::string , with the words to work on
  2. Define a std::regex that finds words only. Whitespaces and other delimiters are ignored
  3. Use the std::transform to transform the input string into output lines

std::transform has 4 parameters.

  1. With what the transformation should begin. In this case, we use the std::sregex_token_iterator . This will look for the regex (so, for the word) and return the first word. That's the begin.
  2. With what the transformation should end. We use the empty std::sregex_token_iterator . That means: Do until all matches (all words) have been read.
  3. The destination. For this we will use the std::ostream_iterator . This will send all transformed results (what the lambda returns) to the given output stream (in our case std::cout ). And it will add a delimiter, here a newline ("\\n").
  4. The transormation function. Implemented as lambda. Here we get the word from the std::sregex_token_iterator and transform it into a new word according to what we want. So, a word with a capitalized first letter. We add a little bit text for the output line as wished by the OP.

Please check:

#include <string>
#include <iostream>
#include <regex>
#include <iterator>

int main()
{
    // 1. This is the string to convert
    std::string line("Hi there buddy");

    // 2. We want to search for complete words
    std::regex word("(\\w+)");

    // 3. Transform the input string to output lines
    std::transform(
        std::sregex_token_iterator(line.begin(), line.end(), word, 1),
        std::sregex_token_iterator(),
        std::ostream_iterator<std::string>(std::cout, "\n"),
        [i = 1](std::string w) mutable {                               
            return std::string("List[") + std::to_string(i++) + "]=" + static_cast<char>(::toupper(w[0])) + &w[1];
        }
    );
    return 0;
}

This will give us the following output:

List[1]=Hi
List[2]=There
List[3]=Buddy

Please get a feeling for the capabilities of C++

Found a solution for your next problem (when the user inputs a sentence only the first word it displayed). When you input a "space", the cin just thinks you are done. You need to use the getLine() to get the whole sentence.

getline(cin, line);

Instead of

cin>>line;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM