c字符串无法显示(也可能是输入)

时间:2015-05-13 01:33:15

标签: c++ c-strings

我被困在代码的这一部分。这里的问题是当我还没有完成我的输入时,控制台的显示总是被切断。这是代码:

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()纠正它时,结果仍然是相同的。

有什么方法可以解决这个问题吗?谢谢!

2 个答案:

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