【问题标题】:My program doesn't work with strcat - I can't seem to get why?我的程序不适用于 strcat - 我似乎不明白为什么?
【发布时间】:2020-04-12 08:34:39
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 1.使用std::string 2. 使用+ 连接
  • 请选择 C ​​和 C++。我希望 StackOverflow 不会让您同时选择两者。
  • @AndyG 对不起 - 我这样做的原因是因为在课堂上我们正在学习 c++,但实际上我们正在做很多 c 风格的事情。包括使用字符数组。不幸的是,我不能使用 std::string。
  • strcat 要求目标是一个以空字符结尾的字符数组。 char final[101] 声明了一个未初始化的数组,因此您对 strcat 的调用会调用未定义的行为
  • 这能回答你的问题吗? Why do i first have to strcpy() before strcat()?

标签: c++


【解决方案1】:

您的问题是所有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 中它是未定义的(因为您没有返回语句)。所以你用 C 编译器而不是 C++ 编译器编译你的代码。

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

【讨论】:

  • 答案也很好。这是解决方案 - 但另一个答案更快,所以我会接受那个。不过感谢您的宝贵时间!
【解决方案2】:

你需要初始化final

strcpy(final, "");

在开始使用 strcat 之前使其为空终止。

或者只是设置

final[0] = 0;

【讨论】:

    【解决方案3】:

    试试这个'c'

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

    【讨论】:

    • memset 在做什么?
    • memset() 将内存块设置为指定的值...在上面它将所有元素设置为 0,因此将内存初始化为零。
    【解决方案4】:

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

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

    【讨论】:

    • 不幸的是,我无法在我的问题中使用 std::string。
    【解决方案5】:

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

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

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

    【讨论】:

    • 这对我的问题有帮助吗?
    • 是的,你得到一个空白输出,因为你以空终止符开始字符串,但在我的建议中,你将确保它以有效字符开头。
    猜你喜欢
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2011-02-03
    相关资源
    最近更新 更多