我的程序无法与strcat一起使用-我似乎无法理解为什么?

时间:2019-12-19 18:12:27

标签: c++

作为一项家庭作业,我必须编写一个程序,用“ *”替换由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,这是导致错误的原因,但是我不确定。我说的对吗?

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

谢谢。

5 个答案:

答案 0 :(得分:3)

您的问题是所有C-String函数都希望您的字符串以null结尾(即,字符'\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可以作为任何有效值。

答案 1 :(得分:2)

您需要初始化final

strcpy(final, "");

使它为null终止,然后再将其与strcat一起使用。

或只是设置

final[0] = 0;

答案 2 :(得分:1)

尝试使用“ c”

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

答案 3 :(得分:1)

C ++的字符串提取器在空白处分割输入;可以节省您很多解析。

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

答案 4 :(得分:1)

您可以使if语句如下所示:

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

所以 final 字符串不会以终止字符开头。