我的工作是编写一个将句子转换为大写和小写的程序。
#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”代表小写字母和大写字母我得到一个大写字母我,为什么我的代码不会打印出完整的句子?我不知道我做错了什么或做错了。
答案 0 :(得分:5)
输入操作符>>
在空白区域(空格,换行符,制表符等)上分隔。如果您想阅读整行,请使用std::getline
:
cout << "Please enter a sentence: ";
getline(cin, sent);
在不相关的说明中,请不要使用65
或32
之类的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::toupper和std::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';
}