我被困在代码的这一部分。这里的问题是当我还没有完成我的输入时,控制台的显示总是被切断。这是代码:
else if (m == 'c')
{
std::cout << "Enter the number of sentences used: ";
int e;
std::cin >> e;
std::cin.clear();
std::cin.ignore(1000, '\n');
std::cout << "You've " << e << " number of sentences required to be filled.\n";
char * f[e];
for (int i = 0; i < e; i++)
{
std::cout << "Enter your " << i << " sentence: ";
std::cin.getline (f[i], 99); //problem lies here
};
char * g = maxn (f, e);
std::cout << "Your longest sentence is: " << g;
}
没有错误或警告消息。它表示正常终止。我认为它可能是null /换行符影响它但是当我用clear()和ignore()纠正它时,结果仍然是相同的。
有什么方法可以解决这个问题吗?谢谢!
答案 0 :(得分:0)
您无法为未初始化的指针赋值。这就是你在std::cin.getline (f[i], 99);
中所做的。
一种解决方案是将声明从char * f[e]
更改为char f[e][99]
。现在f
被初始化为 e 99个字符的字符串。您可以使用getline为每个字符串赋值。
答案 1 :(得分:0)
首先,行
char * f[e];
声明一个可变大小的指向char
的指针数组。这不是有效的标准C ++,而是使用编译器扩展。建议不要使用此类编译器扩展,因为它们会使您的代码无法移植。
其次,最重要的是,您尝试使用getline
读取这些指针,指向未分配的内存。这是错的。你需要为它们分配内存,
char** f = new char*[e]; // now it's ok
for(int i = 0; i<e; ++i)
f[e] = new char[99]; // allocate 99 bytes for each
然后,不要忘记在程序结束时删除它们,
for(int i = 0; i<e; ++i)
delete[] f[e];
delete[] f;
正如您所看到的,它非常混乱且容易出错。使用标准库容器(如std::vector
和std::string
)可以更好地跟踪内存,并且几乎可以像基本类型一样轻松使用它们。如果你想走那条路,那么你应该宣布
std::vector<std::string> f(e); // must #include <vector> and #include <string>
相反,然后将句子读作
std::getline (std::cin, f[i]);
当然你也应该修改你的/ char*
采取/返回std::string
的函数,但是一旦你这样做,你的程序将更加安全,易于阅读/理解/调试
此外,在您使用cin
阅读(并且可能验证输入)之后,您需要cin.ignore(...)
,否则新行将保留在缓冲区中并被“吃掉”由第一个getline
。
这是您的代码在现代C ++中的外观,包括cin
验证:
#include <algorithm>
#include <iostream>
#include <limits>
#include <string>
#include <vector>
int main()
{
std::cout << "Enter the number of sentences used: ";
int e;
while(!(std::cin >> e)) // validate input
{
std::cin.clear(); // clear the error flags
// discards everything else up to newline
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
std::cout << "Enter the number of sentences used: "; // repeat
}
std::cout << "You've " << e << " number of sentences required to be filled.\n";
// IMPORTANT after cin and before getline
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
std::vector<std::string> f(e); // our vector of sentences
for (int i = 0; i < e; i++)
{
std::cout << "Enter your " << i << " sentence: ";
std::getline (std::cin, f[i]);
}
auto it = std::max_element(f.begin(), f.end(), // this may look funky
[](const std::string& lhs, const std::string& rhs)
{
return lhs.size() < rhs.size();
}
);
std::cout << "Your longest sentence is: " << it->size() << std::endl;
}