[英]My program doesn't work with strcat - I can't seem to get why?
作为作业,我必须制作一个程序,用“*”替换所有由 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
函数都希望您的字符串以空字符结尾(即字符'\\0'
作为字符串的最后一个字符。
问题是final
没有初始化。 它可以包含任何数量的原始垃圾。 因此,当您使用strcat()
它必须找到结尾(可能在任何地方)。
解决方案是初始化final
以确保它是零长度的C-String
。
char cuvant[101];
char final[101] ={0}; // Fills the array with zero
或者。
char final[101];
final[0] = '\0'; // Make a C-String of length 0
返回代码。
在 C++ 中,返回码是 0。但在 C 中它是未定义的(因为你没有 return 语句)。 因此,您使用 C 编译器而不是 C++ 编译器编译了代码。
未定义的值可以是任何东西。 值-1073741819
是有效的。
您需要初始化final
strcpy(final, "");
在开始将其与 strcat 一起使用之前,使其空终止。
或者只是设置
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, " ");
}
所以最终的字符串不会以终止字符开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.