【问题标题】:C++ Debug Assertation Failed: "String is not null terminated"C++ 调试断言失败:“字符串不是空终止的”
【发布时间】:2015-01-12 05:19:29
【问题描述】:

我和一个朋友正在尝试解决this 问题来练习编程。我们已经解决了它,但它实际上只能在他运行 ubuntu 的计算机上运行。他正在使用gedit进行编译。我们想出的解决方案是:

#include <iostream>
#include <string>
using namespace std;

int main()
{
char input[999], sentence[999];

cout << "Enter a sentence in all lower case with no punctuation." << endl;

cin.getline(input, 999);
strcat(sentence, input);

for(int x=0; input[x] != 0; x++)
{
        if (!(input[x] == 'a' || input[x] == 'e' || input[x] == 'i' || input[x] == 'o' || input[x] == 'u' || input[x] == ' '))
        {
            cout << input [x];
        }
}
    cout << endl;

    for(int x=0; input[x] != 0; x++)
    {
            if (input[x] == 'a' || input[x] == 'e' || input[x] == 'i' || input[x] == 'o' || input[x]         == 'u')
            {
            cout << input[x];
            }
    }       
    cout << endl;

    return 0;
}

它在他的计算机上成功运行,但我使用的是 Visual Studio 12,我得到了一个 debug assertion error。它指出

Expression: (L"String is not null terminated"&&0).  

我收到此错误而他没有收到此错误的任何原因?

【问题讨论】:

  • 'sentence' 未初始化,所以指向它的是 UB。
  • 使用 strcpy 代替 strcat。
  • ..或者使用实际的字符串类型而不是字符数组。
  • 事实上,你为什么还需要一个句子变量呢?你似乎没有使用它。
  • @icemanind - 好点:)没有注意到它没有被使用。也许 OP 为 SSCCE 编辑了一堆杂乱无章的东西。

标签: c++


【解决方案1】:

在 C 中,字符串只是连接在一起的几个字符,以空终止符 (\0)(ASCII 代码 0)终止。

您可以通过以下两种方式之一声明字符串。一种方法是使用指针声明:

char *input;

指针声明告诉 C 期望一个 char 类型的指针。稍后,您将继续使用 malloc 为字符串动态分配空间。

第二种声明字符串的方法是创建一个数组或字符。这是您正在使用的方法:

char input[999];

您告诉编译器您需要 999 字节的 char 类型来存储数据。编译器分配 999 个字节,但它不初始化它。初始化字符串数组最简单的方法是这样的:

input[0] = 0;

通过这样做,数组中的第一个元素被设置为空终止符。如果要保证每个元素都设置为 0,可以使用 memset:

memset(input, 0, 999);

C 有很多字符串函数。其中之一是strcatstrcat 将两个字符串连接在一起。就您而言,问题是由于未初始化字符串,因此“垃圾数据”在您的字符串中。当您不初始化它时,任何类型的随机数据都可能在您的字符串中,这就是您收到错误的原因。你的朋友没有因为偶然的运气而得到错误。他也很容易得到错误。该字符串可能分配在恰好被 0(空终止符)填充的内存区域中。

strcpy 有效,因为strcpy 复制了一个字符串的内容并将其放入另一个字符串。其他字符串是否已初始化并不重要。它只会用源字符串覆盖它。

我希望这可以为您解决问题!

【讨论】:

    【解决方案2】:

    检查每个编译器基于不同的位和操作系统制作的操作系统位或编译器位类型...它可能会导致可变大小的错误存储和每个位的内存访问取决于操作系统位或编译器位或处理器位...所以尝试通过更改字符串变量大小来编译程序....例如 MinGW-w64 是为 64 位操作系统制作的。

    【讨论】:

    • 这不会为问题增加任何价值。
    猜你喜欢
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多