整数到指针类型转换

时间:2021-06-25 14:31:57

标签: c cs50

int count_words(string word)
{
    string spaces = "";
    int total_words = 1;
    int i, j = 0 ;
    for (i = 0;  i < strlen(word); i++)
    {
        strcpy(spaces, word[i]);
        if (strcmp(spaces, " ") == 0)
        {
            total_words = total_words + 1;
        }
    }
    return total_words;
}

我正在尝试在 c 中创建一个获取单词总数的函数,我的策略是找到字符串输入中的空格数。但是,我在 strcpy 处收到关于整数到 ptrtype 转换的错误。我似乎无法在没有得到错误的情况下比较 2 个字符串。有人可以向我解释错误是如何发生的以及我将如何修复它。 IDE 还建议我在 word[i] 旁边添加一个&符号,但它会导致分段错误输出

1 个答案:

答案 0 :(得分:3)

您需要更多地了解 C 中字符和字符串之间的区别。

当你说

strcpy(spaces, word[i]);

看起来您正在尝试将一个字符复制到一个字符串中,以便在下一行中执行

if (strcmp(spaces, " ") == 0)

将字符串与由一个空格字符组成的字符串进行比较。

现在,这是真的,如果您要比较两个字符串,则必须调用 strcmp。类似的东西

if (spaces == " ")        /* WRONG */

绝对不会剪的。

不过,在这种情况下,您不需要比较字符串。您一次检查输入一个字符,因此您可以使用简单的字符比较来代替。去掉 spaces 字符串和对 strcpy 的调用,然后执行

if (word[i] == ' ')

请注意,我比较的是字符 ' ',而不是字符串 " "。使用 == 来比较这样的单个字符非常好。

有时,您确实必须“手动”用单个字符构造一个字符串,但是当您这样做时,它会更复杂一些。它看起来像这样:

char spaces[2];
spaces[0] = word[i];
spaces[1] = '\0';
if (strcmp(spaces, " ") == 0)
    ...

这行得通,您可能想尝试一下以确保,但这太过分了,没有理由这样写,除非作为学习练习。

为什么你的代码没有

strcpy(spaces, word[i]);

工作?关于“整数到指针转换”的错误是什么意思?其实这里有几处不对。

  1. 不清楚字符串 spaces 的实际类型是什么(稍后会详细介绍),但它最多可容纳 0 个字符,因此您将无法复制 1-字符串插入其中。
  2. 还不清楚 spaces 是否可写。它可能是一个常量,这意味着您不能合法地将任何字符复制到其中。
  3. 最后,strcpy 将一个 string 复制到另一个。在 C 中,虽然字符串是数组,但它们通常被称为指针。所以 strcpy 接受两个指针,一个指向源字符串,一个指向目标字符串。但是您传递了它 word[i],它是单个字符,而不是字符串。假设字符是 A。如果您没有收到错误消息,并且如果 strcpy 尝试完成它的工作,它会将 A 视为一个指针,并且它会尝试从内存中的地址 65 复制一个字符串(因为字符 A 的 ASCII 值为 65)。

这个例子表明在 C 中处理字符串有点棘手。字符串表示为数组,但数组在 C 中是二等公民。你不能传递数组,但数组通常由简单的指向它们的第一个元素的指针,您可以传递它。一旦你理解了它,它就会变得非常方便和高效,但一开始会让人感到困惑,需要一些时间来适应。

如果 C 确实 有一个内置的、一流的字符串类型可能会很好,但它没有。因为它没有,所以 C 程序员在处理字符串时总是牢记数组和字符之间的区别。他们在 CS50 中为您提供的“方便”string typedef 被证明是一个坏主意,因为它实际上根本不方便 - 它只是隐藏了一个重要的区别,最终使事情变得更加混乱。

相关问题