c++ 从用户那里取一个词并按如下所示打印,输入该词:Word第二顺序Word [已关闭]

wkftcu5l  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(114)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2天前关闭。
Improve this question
编写一个C++代码,从用户那里获取一个单词,并如下所示打印出来。

Enter the word: Word d rd ord Word

我试图解决这个问题;

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

int main() {
    string word;
    cout << "Enter the word: ";
    cin>>word;
        for (int i = 0; i < word.length(); i++) {
        for (int j = i; j < word.length(); j++) {
            cout << word[j];
        }
        cout << endl;
    }
    return 0;
}

但这给出的结果为:

word
ord
rd
d

我怎样才能改变这个代码给予结果;

d 
rd
ord
word
qxsslcnc

qxsslcnc1#

要获得预期的输出,可以让外部循环从word.length() - 1向下循环到0

#include <cstddef>   // std::size_t
#include <iostream>
#include <string>

int main() {
    std::cout << "Enter the word:";

    if (std::string word; std::cin >> word) {
        for (auto i = word.length(); i--;) {                   // <- here
            for (std::size_t j = i; j < word.length(); j++) {
                std::cout << word[j];
            }
            std::cout << '\n';
        }
    }
}

注意,我将ij更改为(unsignedstd::size_t s,而不是(signedintstd::size_t是用于length()成员函数的正确类型。
您还可以通过完全跳过内部循环来简化它:

for (auto i = word.length(); i--;) {
            // supply a char* where to start printing from:
            std::cout << &word[i] << '\n';
        }
rnmwe5a2

rnmwe5a22#

首先,这份声明

cin>>word;

只能读取一个单词。也就是说,如果您将按照问题中所示输入

Enter the word: Word d rd ord Word

则变量word将仅包含一个字符串"Word"而不是键入的完整字符串"Word d rd ord Word"
您需要使用标准函数std::getline来代替运算符>>
否则你问题中的这一行

Enter the word: Word d rd ord Word

没有任何意义。
看起来您需要按照字符串中包含的单词的长度以升序输出输入的字符串"Word d rd ord Word"中的单词,而不需要重复。
使用标准容器std::set可以轻松完成此操作。
这是一个演示程序。

#include <iostream>
#include <sstream>
#include <string>
#include <set>

int main()
{
    std::string word;

    std::cout << "Enter the word: ";
    std::getline( std::cin, word );

    auto cmp = []( const std::string &s1, const std::string &s2 )
    {
        return s1.length() < s2.length();
    };

    std::set<std::string, decltype( cmp )> s( cmp );

    std::stringstream iss( word );

    for (std::string w; iss >> w; )
    {
        s.insert( w );
    }

    for (const auto &w : s)
    {
        std::cout << w << '\n';
    }
}

程序输出为

Enter the word: Word d rd ord Word
d
rd
ord
Word

如果不是这个输入

Enter the word: Word d rd ord Word

您指的是以下输入

Enter the word: Word

并且想要从输入的字符串的末尾开始输出子字符串,则可以通过以下方式仅使用一个for循环和类std::string_view来完成

#include <iostream>
#include <string>
#include <string_view>

int main()
{
    std::string word;

    std::cout << "Enter the word: ";
    std::cin >> word;

    for (auto n = word.length(); n != 0; )
    {
        std::cout << std::string_view( word.c_str() + --n ) << '\n';
    }
}

程序输出与上面所示的类似(除了输入的字符串),尽管程序执行不同的操作

Enter the word: Word
r
rd
ord
Word
mpbci0fu

mpbci0fu3#

如果您养成 * 不 * 使用ij这样的变量名的习惯,而坚持使用对您 * 有意义 * 的名称,那么这会变得容易得多!

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

int main() {
    string word;
    cout << "Enter the word: ";
    cin>>word;
        for (int starting_point = 0; starting_point < word.length(); starting_point++) {
        for (int position = starting_point; position < word.length(); position++) {
            cout << word[position];
        }
        cout << endl;
    }
    return 0;
}

你现在明白为什么你不倒着数字母了吗?这是同样的代码,但我用了更好的名字。
我会给予你一个完全不同的解决方案,只是为了说明“言出必行”的意义;也许这足以帮你修复你自己的代码!

#include <iostream>
#include <string>
#include <string_view>

int main() {
    std::string word;
    std::cout << "Enter the word: ";
    std::cin >> word;

    auto current_begin = word.end();
    while (current_begin != word.begin()) {
        --current_begin;
        std::cout << std::string_view(current_begin, word.end()) << "\n";
    }

    return 0;
}

相关问题