“cin”怎么会弄乱一个循环?

Posted

技术标签:

【中文标题】“cin”怎么会弄乱一个循环?【英文标题】:How can "cin" mess a loop up? 【发布时间】:2020-08-21 12:46:06 【问题描述】:

我编写了一个程序,可以让您插入 n 个名称,然后在屏幕上打印这些名称。当我将 n 设置为固定值时,程序运行良好。但是,当我添加 cin 命令 cin>>n 时,程序似乎跳过了第一个循环。我注意到每当我使用cin 时,都会出现问题。我想当我在输入的cin命令上按回车时,告诉第一个循环 n[0]=''(也许)。你们能帮我解决这个问题吗?对不起我的英语。

代码如下:

#include <iostream>
#include <string.h>
using namespace std;

int main()
int n;cin>>n;//the root of the problem(i think)
    char **p = new char *[n];
    for (int i = 0; i < n; i++)
    
        *(p + i) = new char[255];
     //make a 2 dimensional array of strings

    for (int i = 0; i < n; i++)
    
        char n[255] = "";
        cout << "insert names no."<<i+1<<": ";
        gets(n); 
        strcpy(p[i], n);//insert the names into the array of strings
    

    for (int i = 0; i < n; i++)
    
        cout << p[i] << endl; //print the names
    

【问题讨论】:

使用 cin 读取 int 不会消耗您发送的换行符,因此下一次读取会消耗它 您应该检查 cin 后面的 n 的值,以验证它是一个有效值。还要检查 cin >> n 是否成功, 我可以原谅你的英语,但你的 C++ 需要改进 ;) gets - “C 标准的最新版本 (2011) 已明确从其规范中删除了此函数。该函数在 C++ 中已弃用(截至 2011 年标准,如下C99+TC3)。” char n 为什么要重复使用n 【参考方案1】:

行:

cin >> n;

将读取您输入的所有数字,但不会读取后面的换行符。然后,您拨打gets() 将获取这个单一的换行符。这最终导致名字为空。

你可以:

在终端提示符处使用 Ctrl+D 而不是 Return 发送值而不发送换行符 或使用cin &gt;&gt; n &gt;&gt; ws 跳过空白。在这种情况下,您还必须#include &lt;iomanip&gt;

另外,你最好不要混合使用 iostream 和 stdio 函数,你应该使用 std::string 而不是 C 字符串。

【讨论】:

以上是关于“cin”怎么会弄乱一个循环?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 fread 会弄乱我的字节顺序?

从 Serializer 调用另一个序列化程序会弄乱 URI

iOS 以编程方式截屏会弄乱图像

为啥浏览器的后退按钮会弄乱我的 Vue 组件?

缩放会弄乱 uipagecontrol 的当前页面

旋转 SplitViewController 会弄乱主视图中的工具栏