c 字符串无法显示(可能无法输入)
c strings unable to display (and maybe input)
我卡在这部分代码了。这里的问题是,当我还没有完成输入时,控制台的显示总是中断。这是代码:
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/newline 个字符影响了它,但是当我用 clear() 和 ignore() 纠正它时,结果还是一样。
有什么办法可以解决这个问题吗?谢谢!
您不能为未初始化的指针赋值。这就是您在 std::cin.getline (f[i], 99);
中所做的。
一种解决方案是将声明从 char * f[e]
更改为 char f[e][99]
。现在 f
被初始化为 e 99 个字符的字符串。您可以使用 getline 为每个字符串赋值。
首先,行
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]);
当然你也应该把你的take/returnchar*
修改成take/returnstd::string
,但是一旦你这样做了,你的程序会更安全和容易至 read/understand/debug.
此外,在使用 cin
完成读取(并可能验证输入)后,您需要 cin.ignore(...)
,否则换行符将留在缓冲区中,并且它是 "eaten" 由第一个 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;
}
我卡在这部分代码了。这里的问题是,当我还没有完成输入时,控制台的显示总是中断。这是代码:
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/newline 个字符影响了它,但是当我用 clear() 和 ignore() 纠正它时,结果还是一样。
有什么办法可以解决这个问题吗?谢谢!
您不能为未初始化的指针赋值。这就是您在 std::cin.getline (f[i], 99);
中所做的。
一种解决方案是将声明从 char * f[e]
更改为 char f[e][99]
。现在 f
被初始化为 e 99 个字符的字符串。您可以使用 getline 为每个字符串赋值。
首先,行
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]);
当然你也应该把你的take/returnchar*
修改成take/returnstd::string
,但是一旦你这样做了,你的程序会更安全和容易至 read/understand/debug.
此外,在使用 cin
完成读取(并可能验证输入)后,您需要 cin.ignore(...)
,否则换行符将留在缓冲区中,并且它是 "eaten" 由第一个 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;
}