0

不知何故,当我运行这段代码并输入字符串时,第一个 i=0 的字符串被跳过,它开始从 A[1] 输入字符串。所以我最终得到 A[0] 充满了内存中的随机内容。有人可以指出问题吗?

cin>>s;
char** A;
A = new char *[s]; 
cout<<"now please fill the strings"<<endl;
for (int i=0;i<s;i++)
{ 
    A[i] = new char[100];
    cout<<"string "<<i<<": ";
    gets(A[i]);
}
4

4 回答 4

5

那个代码太可怕了。下面是它在真正的 C++ 中的样子:

#include <string>
#include <iostream>
#include <vector>

int main()
{
    std::cout << "Please start entering lines. A blank line or "
              << "EOF (Ctrl-D) will terminate the input.\n";

    std::vector<std::string> lines;

    for (std::string line; std::getline(std::cin, line) && !line.empty(); )
    {
        lines.push_back(line);
    }

    std::cout << "Thank you, goodbye.\n";
}

请注意没有任何指针或new表达式。

如果您愿意,可以通过在循环std::cout << "> " &&中条件检查的开头添加一些提示打印。for

于 2012-12-18T21:37:50.317 回答
2

可能是因为您正在使用gets()...永远不要使用gets() 而是使用fgets()。

得到与 fgets

于 2012-12-18T21:34:59.250 回答
1

好吧,您可能会得到一个空字符串:读取s时使用格式化输入,一旦遇到非数字就停止,例如,用于指示其输入完成的换行符。gets(),因此,立即找到一个换行符,终止读取的第一个字符串。

也就是说,你永远不要使用gets():这是一个主要的安全问题,也是许多潜在攻击的根本原因!相反,您应该使用fgets()or,更好的是,std::getline()std::strings 和 a一起使用std::vector<std::string> >。此外,您应该始终验证输入尝试是否成功:

if ((std::cin >> s).ignore(std::numeric_limits<std::streamsize>::max(), `\n`)) {
    std::string line;
    for (int i(0); i != s && std::getline(std::cin, line); ) {
        A.push_back(line);
    }
}
于 2012-12-18T21:38:09.563 回答
1

问题是,它只是cin>>s;拿起你想要的数字,然后在第一次迭代中留下一个\nenter新闻界的换行符) 。这不是修复它的最佳方法,但为了证明它在该行之后写下这一行:stdingets()

int a = fgetc(stdin);

之后检查a以确认它有一个换行符。

于 2012-12-18T21:38:09.780 回答