2015-06-28 25 views
0

基本上,我只想从用户那里获取字母字符的输入。但是我的代码的这部分似乎总是被跳过。我认为这是条件陈述的问题,但我不知道如何解决它。如果未检测到alpha,则终止循环

#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; 
} 
+0

你是什么意思?“用户只能输入字母字符”的输入? –

+0

没有空格charchters,没有数字等 –

+0

所以你的目标是从用户那里得到一行输入,然后去掉所有非字母字符的那一行? –

回答

0

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

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

执行这些步骤:

  1. 初始化i至0
  2. 转到步骤7如果chi元件是非字母(否则,继续正常)
  3. 分配getchar()的元素ch的结果在i
  4. 打印在i
  5. 增量i
  6. 围棋ch E元素到第2步
  7. 结束循环

,所以你检查ch[i]每一次,你刚刚增加i到一个新的价值。所以ch[i]总是在一步未初始化2.

为了解决这个问题,我猜你会想重新构建循环,使第2步改为步骤3和5

+0

Thx的反馈,帮了我一些。 –

0

您的介于执行循环会被跳过,因为条件在进入循环体之前被评估。

它会评估'isalpha(ch [0])',它可以是任何值,因为你没有初始化你的数组(特别是索引为0的字符)。

你可以改写你对这样的循环,

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

是的,你是礼仪,它确实工作的更好。代码不会被跳过,但是我仍然需要输入键才能捕获击键并且循环结束。 –

0

进一步阅读,我意识到这是无法立即在C++中,因为它一定程度上取决于其大多是行缓冲的终端。因此,在编译窗口时,包括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; 
}