2015-09-19 83 views
0

在学校我们使用整数-999来停止scanf并结束用户放入数组的输入。如何添加输入到数组并停止当用户输入字符串'停止'?

例如:

while(input != -999) { 
    scanf("%i", &input) 
    userArray[i] = input; 
    i++; 
} 

我正在考虑要求字符串输入在用户与输入转换为整数(使用STDLIB atoi),只要输入不是“停止”。

这是个好主意吗?有一个更好的方法吗?

回答

4

作为字符串读入并将其转换为int实际上是优选的,因为它避免了与scanf

特殊性相关而是使用fgets,其读取一行输入的潜在缺陷。这个函数将新行字符添加到输入字符串中,因此在做其他事情之前一定要修剪掉它。一旦你这样做了,你可以使用strcmp来查看该字符串是否等于“stop”,如果不是,则调用atoi,或更好的strtol(它具有更好的错误检查)来获取数值。

+0

肯定使用'strtol',而不是'atoi'。 +1表示 –

+0

谢谢!我会给它一个 – Anon101

0

在我看来,当你读取未知数量的输入时,停止循环的最好方法是(同样也是Stanley B. Lippman所说的C++ Prime)你应该尝试使用“无效输入” (如果你想使用一点C++)。

您可以使用此sintax:通过键入

如果你是在Windows系统中,我们输入一个文件结束:

while(std::cin >> input) { 
    userArray[i] = input; 
    i++; 
} 
  • 档案结尾control-z(按住Ctrl键并按z)。在UNIX系统中,包括OS X系统,档案结尾通常是control-d

    • 无效输入:

    所以每当你键入一个浮点数字或任何其他类型的,这是对于你的输入来说不是一个int,循环将结束。

    PS:这适用于C++,所以我真的不知道这是否会正常工作的下

+1

在C中没有'std :: cin'这样的东西,它所依赖的所有东西都是缺乏的:类,操作符重载,引用 –

+0

@BenVoigt是的,这是真的,所以我认为这答案会更多地关于C++,在这种情况下不是很有帮助。 –

0

如何停止循环当输入为“停止”:

你将使用string.h库。

do{ 
    scanf("%s", input) 
    userArray[i] = input; 
    i++; 
} while(strcmp(input, "stop") != 0); 

STRCMP阵列input字符串“停止”进行比较,只要输入不是“停止”,将继续保持运行。

按照dbush的建议,使用fgets,会好很多。

+0

用更好的语法编辑后,可能更好的解释。顺便说一句,这是假设输入是一个'char'数组。 –

+2

我怀疑这会工作,因为它应该。如果我在控制台输入“stop”,它会首先将值存储到数组中,然后在下一次迭代中while循环不会执行。 –

+1

应该是'scanf(“%s”,输入);'因为数组已经衰减到一个指针,'userarray [i] = input;'试图分配不兼容的类型:需要某种解析。 –

0

另一种解决方案,我喜欢用: -

while(true) 
{ 
scanf("%s", input); 
if(!strcmp(input, "stop")) 
    break; 
userarray[i]= input; 
i++; 
} 
+0

不应该是'if(strcmp(input,“stop”)== 0)'? – owacoder

+0

编号'if(strcmp(input,“stop”))'表示strcmp()比较返回的结果是否为true,然后执行某些操作,在我的情况下,它将从while循环中断开。 –

+0

您发布的条件意味着返回的结果是否为假,然后从循环中断开,这意味着用户提供的输入是“停止”以外的其他内容。 –