我的程序不适用于 strcat - 我似乎不明白为什么?

My program doesn't work with strcat - I can't seem to get why?

本文关键字:明白 为什么 不适用 程序 适用于 strcat 我的      更新时间:2023-10-16

作为家庭作业,我必须制作一个程序,将3个字母组成的所有单词替换为"*"。

例如:

input: cod is everything and I love it
output: * is everything * I love it 

这是我的程序:

int main()
{
char cuvant[101], final[101];
char* pch;
cin.get(cuvant, 100);
pch = strtok(cuvant, " ");
while (pch != NULL)
{
if (strlen(pch) == 3)
{
strcat(final, " *");
}
else
{
strcat(final, " ");
strcat(final, pch);
}
pch = strtok(NULL, " ");
}
cout << final;
}

我没有收到任何错误 - 但输出为空。此外,程序不会以代码 0 退出(因为它应该是(,它说"以代码 -1073741819 退出"。所以显然有些事情正在发生。

我使用strtok/strcat是错误的吗?

我觉得 strcat 不能在我的情况下使用,这就是错误的原因,但我不确定。我说的对吗?

如果是这样,我该如何解决我的问题?

谢谢。

您的问题是所有C-String函数都希望您的字符串以 null 结尾(即字符''作为字符串的最后一个字符。

问题是final没有初始化。它可以包含任何数量的原始垃圾。因此,当您使用strcat()时,它必须找到终点(可能是任何地方(。

解决方案是初始化final以确保它是零长度C-String

char cuvant[101];
char final[101]  ={0}; // Fills the array with zero

或。

char final[101];
final[0] = ''; // Make a C-String of length 0

返回代码。

在C++中,返回代码为 0。但是在 C 中它是未定义的(因为你没有 return 语句(。因此,您使用 C 编译器而不是C++编译器编译了代码。

未定义的值可以是任何值。值-1073741819与任何内容一样有效。

您需要初始化final

strcpy(final, "");

以使其在开始与 strcat 一起使用之前终止 null。

或只是设置

final[0] = 0;

试试这个'c'

memset( cuvant, 0, sizeof( cuvant )); 
memset( final, 0, sizeof( final ));

C++的字符串提取器将输入拆分为空格;这可以为您节省大量解析。

std::string word;
std::string result;
while (std::cin >> word) {
result += ' ';
if (word.length == 3)
result += '*';
else
result += word;

你可以使if语句看起来像这样:

if (strlen(pch) == 3)
{
strcat(final, "* ");
}
else
{
strcat(final, pch);
strcat(final, " ");
}

所以最后一个字符串不会以终止字符开头。