C++ 使用do-while循环| C+对字符串中的字符、单词和行进行计数+;
我正在尝试将一个对字符串中的字符、单词和行进行计数的C++ 使用do-while循环| C+对字符串中的字符、单词和行进行计数+;,c++,visual-c++,C++,Visual C++,我正在尝试将一个对字符串中的字符、单词和行进行计数的while循环转换为do while循环 这是我的while循环: #包括 #包括 #包括 使用名称空间std; int main() { INTC; 整数字符=0; int字=1; int换行符=0; printf(“输入字符串。按enter键,然后按ctrl+Z,然后再次输入以结束字符串。\n”); 而((c=getchar())!=EOF) { 如果(c>='a'&&c='a'&&c问题: 你试图做的事情完全是反自然的,毫无意义。你展示的
while
循环转换为do while
循环
这是我的while
循环:
#包括
#包括
#包括
使用名称空间std;
int main()
{
INTC;
整数字符=0;
int字=1;
int换行符=0;
printf(“输入字符串。按enter键,然后按ctrl+Z,然后再次输入以结束字符串。\n”);
而((c=getchar())!=EOF)
{
如果(c>='a'&&c='a'&&c问题:
你试图做的事情完全是反自然的,毫无意义。你展示的情况应该使用while
循环,而不仅仅是任何循环
解决方案:
从技术上讲,您仍然可以这样做,但这是非常糟糕的风格:
do
{
bool do_end=(c=getchar())!=EOF;
如果(结束)
打破
如果((c>='a'&&c='a'&&c则发布的do
-while
循环存在两个主要问题
第一个是,您正在读取两个字符,但在循环的每个迭代中只处理字符
第二个问题是而(c=getchar()!=EOF)
并没有达到您希望的效果
while(c=(getchar()!=EOF))
这仍然不好,因为这条线有利于检测EOF,但字符会被忽略,以便进一步处理
您必须将do
-while
循环更改为:
do
{
c = getchar();
if ( c == EOF )
{
break;
}
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
characters++;
else if (c == ' ')
words++;
else if (c == '\n')
newlines++;
} while (true);
do
{
c=getchar();
如果(c==EOF)
{
打破
}
如果(c>='a'&&c='a'&&c如其他人所述,那么您所描述的情况更适合使用正常的while
循环,而不是do…while
。然而,尽管如此,也不需要解决代码中的其他问题(如注释中提到的问题),只需给“控制变量”一个在循环内没有影响的初始“虚拟”值,就可以更改许多这样的循环。在您的情况下,c
的零值几乎不可能成为实际的输入值,因此您可以使用:
int c=0;//给c一个初始(非)值。
做
{
//c=getchar();//删除此行,因为它会对每个循环进行两次“读取”!
如果(c>='a'&&c='a'&&c,带do/的while
您正在跳过其他每一个字符。计算getchar
调用和每个调用后面的逻辑。顺便说一句,如果是空字符串,单词计数将为1。此外,在具有多个相邻空格的字符串中,计数将不正确。感谢大家的响应。我已经学习了这是我的第一篇博文。我很高兴我很烂,因为这意味着我可以从你们身上学到更多;)知道什么时候你可能会很烂也很好..或者你用一个read:int c=getchar()来“初始化”c
变量谢谢C++,加里。只是通过执行Dewhile while循环的过程,我可以知道它比一个while循环效率要低得多。我是C++新手,尝试通过各种流控制,更好地理解它们是如何工作的。我现在正在尝试。使用开关函数解决同样的问题。感谢“使用命名空间std;”上的输入。您共享的链接非常有用。
while ((c = getchar()) != EOF);
do
{
c = getchar();
if ( c == EOF )
{
break;
}
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
characters++;
else if (c == ' ')
words++;
else if (c == '\n')
newlines++;
} while (true);