cout没有在控制台输出任何内容。

3

我正在尝试使用cout打印从名为charArray的动态分配的二维字符数组中获取的c字符串。以下是我打印的代码片段:

for(int k=0; k<intSize; k++)
{
    std::cout<<"hello"<<std::endl;
    std::cout<<charArray[intSize-1-k]<<std::endl;
}


for(int i = 0; i<intSize; i++)
{
    delete [] charArray[i];
    std::cout<<i<<std::endl;
}
delete [] charArray;

intSizecharArray 中有多少个 C 字符串。但是当我运行程序时,只打印了一次 "hello",没有打印出其他任何内容,包括第二个 for 循环中的 charArray 和 i。我已经在代码的早期确认过 charArray 已经被正确填充,通过使用 cout 成功输出。我运行了 gdb 来查找问题,在 gdb 中 for 循环完全迭代,所以由于某种原因,在第一个 cout 后,couts 就停止工作了。我还尝试在每个 cout 后刷新,但仍然是同样的情况。


2
问题出在你没有展示的代码中。 - Pete Becker
然而,当我运行程序时,“hello”只被打印一次:可能是intSize的值为1,或者是你的程序在访问charArray[intSize-1-k]时出现了错误。请重现并在[mcve]中发布您的问题。 - Scheff's Cat
请注意,std::endl会刷新输出,因此添加显式刷新(如您所见)不会改变结果。但是在这里刷新并不是问题;一个简单的 '\n' 也可以工作,而不需要过多地刷新。 - Pete Becker
在gdb中,for循环完全迭代完成,或者您打印了一些内容,导致std::cout处于错误状态(例如,您可以检查这个问题,如if (!std::cout.good()) std::cerr << "Oops!\n";)。 - Scheff's Cat
另一个想法(对我之前的评论的跟进):如果您打印到终端,则可能会打印形成特殊终端命令的不可打印字符。这可能会更改终端状态,例如更改为非打印状态。(可能的指标是std::cout始终正常或std::cerr无法正常工作。) - Scheff's Cat
显示剩余2条评论
1个回答

1

试试这个:

#include <iostream>
int main()
{
    const char*nul = nullptr;
    std::cout << "before "<< nul << "after\n";
 }

输出结果将是:

 before

这就是正在发生的事情-您正在尝试打印一个空指针字符串。 charArray [intSize-1-k] 中的其中一个为空。可能超出了边界。写入空字符串会将badbit设置为std::cout
为避免此问题,有两件事情可以做:
  1. 在打印之前验证char*不为空。
  2. std::cout.exceptions(std::ostream::failbit);将使operator<<在有问题的代码行抛出异常。调试器可以捕获异常,并帮助您轻松找到错误(gdb具有catch throw)。如果您有异常处理程序,请不要忘记让它调用std::cout.clear();

原来数组的最后一个元素没有被正确填充,因此在“hello”后cout打印出了nullptr。感谢帮助。 - bob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接