如果未检测到alpha,则终止循环

时间:2015-06-28 00:21:10

标签: c++

基本上,我想只从字母字符中获取用户的输入。但我的代码的这部分似乎总是被跳过。我认为这是条件语句的问题,但我不知道如何解决它。

#include <iostream>
#include <cctype>
int main()
{   
char ch[100];

cout << "Please key in a sentence to get\n\n";
for(int i=0;isalpha(ch[i]);i++)
{
    ch[i]=getchar();
    putchar(ch[i]);
}
return 0;
}

3 个答案:

答案 0 :(得分:0)

您的问题在于for循环的工作方式。这个循环:

for(int i=0;isalpha(ch[i]);i++)
{
    ch[i]=getchar();
    putchar(ch[i]);
}

执行以下步骤:

  1. i初始化为0
  2. 如果ch i的元素是非字母的,则转到第7步(否则,正常继续)
  3. getchar()的结果分配到ch的{​​{1}}元素
  4. i
  5. 打印ch的元素
  6. 增量i
  7. 转到第2步
  8. 循环结束
  9. 因此,每次检查i时,您都会将ch[i]增加到新值。因此,i将始终在步骤2中未初始化。

    为了解决这个问题,我猜你想要重建你的循环,以便在步骤3和5之间的某个地方执行第2步。

答案 1 :(得分:0)

跳过你的for循环,因为在进入循环体之前会评估条件。

它将评估&#39; isalpha(ch [0])&#39;这可能是任何值,因为你没有初始化你的数组(特别是索引0处的字符)。

你可以像这样重写你的for循环,

for ( int i = 0; i < 100; ++i ) {
    ch[i] = getchar();
    if ( !isalpha( ch[i] ) ) {
        break;
    }
    putchar( ch[i] );
}

答案 2 :(得分:0)

从进一步阅读开始,我意识到它在C ++中不可能立即实现,因为它部分取决于主要是行缓冲的终端。因此,在使用windows进行编译时,包括conio.h和使用_getch()有助于解决此特定问题。

#include <conio.h>
#include <iostream>

int main()
{   
char ch[100];

cout << "Please key in a sentence to get\n\n";
for(int i=0;;i++)
{
ch[i]=_getch();
putchar(ch[i]);
if (!isalpha(ch[i]) && ch[i]!=' ') break;
}
return 0;
}