【问题标题】:How to add input to array and stop when user inputs the string 'stop'?当用户输入字符串'stop'时,如何将输入添加到数组并停止?
【发布时间】:2015-12-16 06:55:46
【问题描述】:

在学校我们使用整数 -999 来停止 scanf 并结束用户放入数组中的输入。

例如:

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

我正在考虑向用户询问字符串输入并将输入转换为整数(在 stdlib 中使用 atoi),只要输入不是“停止”即可。

这是个好主意吗?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c string input while-loop


    【解决方案1】:

    以字符串形式读入并将其转换为int 实际上更可取,因为它避免了与scanf 的特性相关的潜在陷阱

    改为使用fgets,它读取一行输入。此函数将换行符添加到输入字符串中,因此请务必在执行任何其他操作之前将其删除。完成后,您可以使用strcmp 来查看字符串是否等于“stop”,如果不等于则调用atoi,或者更好的是strtol(具有更好的错误检查功能)来获取数值。

    【讨论】:

    • 绝对使用strtol 而不是atoi。为此 +1
    • 谢谢!我试试看
    【解决方案2】:

    在我看来,当您读取未知数量的输入时停止循环的最佳方法(也如 Stanly B. Lippman 所说的 C++ Prime) 您应该尝试使用“无效输入” " 或文件结束解决方案(如果您想使用一点 C++)。

    你可以使用这个语法:

    while(std::cin >> input) {
      userArray[i] = input;
      i++;
    }
    
    • 文件结尾:

    如果您使用的是 Windows 系统,我们通过键入 control-z(按住 Ctrl 键并按 z)来输入文件结尾。在 UNIX 系统上,包括在 OS X 机器上,文件结尾通常是 control-d

    • 输入无效:

    因此,每当您输入浮点数或任何其他不是 int 类型的输入时,循环就会结束。

    PS:这适用于 C++,所以我真的不知道它在 C 中是否可以正常工作。

    【讨论】:

    • C 中没有std::cin 这样的东西,它所依赖的所有东西都缺少:类、运算符重载、引用
    • @BenVoigt 是的,这是真的,所以我认为这个答案更多地是关于 C++,在这种情况下没有太大帮助。
    【解决方案3】:

    我喜欢使用的另一个解决方案:-

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

    【讨论】:

    • 不应该是if (strcmp(input, "stop") == 0)吗?
    • 没有。 if(strcmp(input, "stop")) 表示如果 strcmp() 比较返回的结果为真,那么做一些事情,在我的情况下它会从 while 循环中中断。
    • 您发布的条件是指如果返回的结果为假,则退出循环,这意味着用户提供的输入不是“停止”。
    • strcmp() 在相等时返回 0。请参阅this 参考。
    • 应该是scanf("%s", input);,因为数组已经衰减为指针,并且userarray[i]= input; 尝试分配不兼容的类型:需要某种解析。 (哦,现在我看到您从另一个答案中复制了这些错误)
    【解决方案4】:

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

    您将使用string.h 库。

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

    strcmp 将数组input 与字符串“stop”进行比较,只要输入不是“stop”,它就会继续运行。

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

    【讨论】:

    • 用更好的语法编辑帖子,可能还有更好的解释。顺便说一句,这都是假设输入是 char 数组。
    • 我怀疑这是否能正常工作。如果我在控制台中输入“stop”,它会首先将值存储到数组中,然后在下一次迭代中,while 循环将不会执行。
    • 应该是scanf("%s", input);,因为数组已经衰减为指针,并且userarray[i]= input; 尝试分配不兼容的类型:需要进行某种解析。
    • 将其更改为 do while 循环,并从 scanf 中删除了 &,不敢相信我错过了,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多