我和一位朋友正在尝试解决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).
我收到此错误的原因是什么,而他不是?
答案 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有很多字符串函数。其中一个是strcat
。 strcat
将两个字符串连接在一起。在您的情况下,问题是因为字符串未初始化,所以“垃圾数据”在您的字符串中。当你没有初始化它时,任何类型的随机数据都可能在你的字符串中,这就是你得到错误的原因。你的朋友没有因为随机的运气而得到错误。他也很容易得到错误。该字符串可能分配在一个恰好用0填充的内存区域(空终止符)。
strcpy
有效,因为strcpy
复制了一个字符串的内容并将其放入另一个字符串中。是否初始化了其他字符串并不重要。它只是用源字符串覆盖它。
我希望这能为你解决这个问题!
答案 1 :(得分:-2)
检查基于不同Bit和OS的每个编译器的OS位或编译器咬合类型...它可能导致可变大小的错误存储和每位的存储器访问依赖于OS位或编译器位或处理器位...所以尝试使用更改字符串变量大小来编译程序....例如,MinGW-w64是针对64位操作系统。