C ++ Debug Assertation失败:"字符串不是空终止"

时间:2015-01-12 05:19:29

标签: c++

我和一位朋友正在尝试解决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).  

我收到此错误的原因是什么,而他不是?

2 个答案:

答案 0 :(得分:2)

在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复制了一个字符串的内容并将其放入另一个字符串中。是否初始化了其他字符串并不重要。它只是用源字符串覆盖它。

我希望这能为你解决这个问题!

答案 1 :(得分:-2)

检查基于不同Bit和OS的每个编译器的OS位或编译器咬合类型...它可能导致可变大小的错误存储和每位的存储器访问依赖于OS位或编译器位或处理器位...所以尝试使用更改字符串变量大小来编译程序....例如,MinGW-w64是针对64位操作系统。