繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM