2011-11-23 212 views
1

我遇到了scanf()卡住的问题,继续该程序的唯一方法是输入exit。Scanf卡住

我的输入是这样的:

L 1 1 3 4 C 2 3 4 

,其中数字是L和C.

int main() 
{ 
// Get use input and put in array 
int count, x; 
int array[4]; 
char type; 

scanf("%c", &type); 

for (x = 0; x < 2; x++) 
{ 
    if (type == 'L') 
    { 
     for (count = 0; count < 4; count++) 
     { 
      scanf("%d", &array[count]); 
     } 

    } else if (type == 'C') 
    { 
     for (count = 0; count < 3; count++) 
     { 
      scanf("%d", &array[count]); 
     } 

    } 
    if (scanf("%*[ \n\t]%c", &type) == 0) 
    { 
     printf("Error"); 
     break; 
    } 
} 

scanf函数语句有问题的参数:

scanf("%*[ \n\t]%c", &type) 

作品好吧,如果我不是在线的末尾,但另有其他。但是,我不知道有多少个L和C对象,因此不能依赖for循环的值。

+0

我有点失落你的问题。该代码正好读取两个块(每个都是'L####'或'C###'),跳过空格,再读一个字符,然后退出。它应该做什么?你让它听起来像它应该保持阅读 –

+0

目前它只读了两个,但我将它改为一个while循环,以便我可以读取未知数量的块。我在阅读所有的块时遇到了困难,不过因为阅读最后一个字符时的scanf被卡住了,虽然从技术上讲所有的字符都被读过了,所以我猜这是它被卡住的原因。 – Denis

+0

检查每个'scanf()'调用的返回值;它可能是其中一个失败并为下一个造成问题的其中一个。 –

回答

2

我觉得你的问题是在这里:

if (scanf("%*[ \n\t]%c", &type) == 0) 

你尝试检查,如果你出的字符阅读,所以要检查是否scanf返回EOF(这是-1,只是使用EOF常量)。如果你打破,当你看到EOF返回你结束输入过程中,你会尽快退出循环(按Ctrl +d在Linux上,我相信按Ctrl +ž在Windows中输入

+0

谢谢。我认为EOF是一个换行符,但显然不是,所以我将使用getline()来读取整行,所以我知道它是整个行。 – Denis

2

如果你的数据是面向行的,你可能会更好地使用POSIX 2008的fgets()或可能的getline()读取行,然后使用sscanf()解析行。