为什么我的代码会继续打印“i”而不是完整的句子?

时间:2016-02-25 08:43:16

标签: c++

我的工作是编写一个将句子转换为大写和小写的程序。

#include <iostream>
using namespace std;


int main ()
{
int current;
string sent;
cout << "Please enter a sentence: ";
cin >> sent;
for (int i = 0; i < sent.length(); i++)
{
    current = (int) sent[i];
    cout << "Your sentence in all lower case: "<< sent;
    cout << endl;
    if (current >= 65 && current <= 90)
    {
        current += 32;
        sent[i] = (char) current;
        cout << "Your sentence in all upper case: " << sent;
    }
    }

return 0;

}

输出应为:

请输入一句话:我吃苹果!

所有小写的句子:我吃苹果!

所有大写的句子:我吃了!

然而,我一直得到一个小写的“i”代表小写字母和大写字母我得到一个大写字母我,为什么我的代码不会打印出完整的句子?我不知道我做错了什么或做错了。

4 个答案:

答案 0 :(得分:5)

输入操作符>>在空白区域(空格,换行符,制表符等)上分隔。如果您想阅读整行,请使用std::getline

cout << "Please enter a sentence: ";
getline(cin, sent);

在不相关的说明中,请不要使用6532之类的magic numbers。如果你的意思是字符然后使用实际的字符文字,如'A''a' - 'A'(请注意,例如'a' - 'A'在所有编码中无效,它在ASCII中工作,这是最常见的编码,但它真的不便携)。这也是假设这是一个学校作业,否则你应该使用例如std::toupper以及一些合适的standard algorithm function

答案 1 :(得分:1)

你应该有两个循环。将使用一个循环将句子的所有字母转换为小写,另一个循环将用于将句子的所有字母转换为大写。

同样要输入句子,您应该使用标准函数std::getline。您需要包含标题<string>

例如

#include <iostream>
#include <string>
//^^^^^^^^^^^^^^^

using namespace std;

int main()
{
    string sentence;

    cout << "Please enter a sentence: ";
    getline( cin, sentence );
    //^^^^^^^^^^^^^^^^^^^^^^

    cout << "Your sentence in all lower case: ";

    for ( string::size_type i = 0; i < sentence.length(); i++ )
    {
        char c = sentence[i];
        if ( c >= 'A' && c <= 'Z' )
        {
            c |= ' ';
        }
        cout << c;
    }
    cout << endl;


    cout << "Your sentence in all upper case: ";
    for ( string::size_type i = 0; i < sentence.length(); i++ )
    {
        char c = sentence[i];
        if ( c >= 'a' && c <= 'z' )
        {
            c &= ~' ';
        }
        cout << c;
    }
    cout << endl;

    return 0;
}

程序输出可能看起来像

Please enter a sentence: I Eat Apples!
Your sentence in all lower case:  i eat apples!
Your sentence in all upper case:  I EAT APPLES!

注意使用空白字符' '而不是幻数32将字母转换为大写或小写字母。这允许将该方法也应用于EBCDIC字符。

您可以将循环替换为基于范围的循环。例如

    for ( char c : sentence )
    {
        if ( c >= 'A' && c <= 'Z' ) c |= ' ';
        cout << c;
    }
    cout << endl;

答案 2 :(得分:0)

你的代码很难转换为大写/小写,有一些算法int STL可以在C ++中轻松完成。退房 - &gt; How to convert std::string to lower case?

另外,正如其他人提到的那样,使用getline从输入流中获取你的行

希望这个帮助=)

答案 3 :(得分:0)

提取运算符>>将空格(空格,制表符,换行符等)视为终止正在提取的值。

因此写作:

std::string str;
std::cin >> str;

如果我们输入This is a string,则只会提取This

要获得整行,您可以使用函数std::getline,包括<string>,它将输入流作为第一个参数,一个字符串作为第二个参数,并且可选地将分隔符作为第三个参数:

std::string sentence;
std::cout << "Please enter a sentence: ";
std::getline(std::cin, sentence);

要将所有字符转换为大写或小写,您可以使用<cctype>库,其中包含std::toupperstd::tolower

这可以通过使用循环轻松完成:

std::string sentence_upper(sentence);
for (unsigned int i = 0; i != sentence_upper.length(); ++i) {
    sentence_upper[i] = std::toupper(sentence_upper[i]);
}

或者如果你有一个符合C ++ 11的编译器,你可以使用基于范围的for循环:

std::string sentence_upper(sentence);
for (auto &ch : sentence_upper)
    ch = std::toupper(ch);

全部放在一起:

int main()
{
    // Get input from user
    std::string sentence;
    std::cout << "Please enter a sentence: ";
    std::getline(std::cin, sentence);

    // Create new string, convert to upper
    std::string sentence_upper(sentence);
    for (unsigned int i = 0; i != sentence_upper.length(); ++i) {
        sentence_upper[i] = std::toupper(sentence_upper[i]);
    }

    // Output converted string
    std::cout << "Your sentence in upper case:\n";
    std::cout << sentence_upper << '\n';
}