整数到指针类型转换

Integer to pointer type conversion

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] 旁边添加一个符号,但它随后会产生分段错误输出

你需要多了解一点C语言中字符和字符串的区别

当你说

strcpy(spaces, word[i]);

看起来您正试图将一个字符复制到一个字符串中,因此您可以在下一行中执行

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

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

现在,确实如此,如果 您正在尝试比较两个字符串,则必须调用 strcmp。像

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

肯定不会剪

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

if (word[i] == ' ')

请注意,我正在与 字符 ' ' 进行比较,而不是 字符串 " "。使用 == 来比较单个字符是完全没问题的。

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

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

这会奏效,您可能想尝试一下以确保万无一失,但这太过分了,没有理由这样写,除非作为学习练习。

为什么你的代码没有

strcpy(spaces, word[i]);

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

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

此示例表明在 C 中使用字符串有点棘手。字符串表示为数组,但数组是 C 中的第二公民class。您不能传递数组,但数组通常通过指向其第一个元素的简单指针来引用,您 可以 传递它。一旦你理解了它,就会发现它非常方便和高效,但一开始它会让人感到困惑,并且需要一些时间来适应。

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