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::vectorstd::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;
}