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] 旁边添加一个&符号,但它会导致分段错误输出
答案 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]);
工作?关于“整数到指针转换”的错误是什么意思?其实这里有几处不对。
spaces
的实际类型是什么(稍后会详细介绍),但它最多可容纳 0 个字符,因此您将无法复制 1-字符串插入其中。spaces
是否可写。它可能是一个常量,这意味着您不能合法地将任何字符复制到其中。strcpy
将一个 string 复制到另一个。在 C 中,虽然字符串是数组,但它们通常被称为指针。所以 strcpy
接受两个指针,一个指向源字符串,一个指向目标字符串。但是您传递了它 word[i]
,它是单个字符,而不是字符串。假设字符是 A
。如果您没有收到错误消息,并且如果 strcpy
尝试完成它的工作,它会将 A
视为一个指针,并且它会尝试从内存中的地址 65 复制一个字符串(因为字符 A
的 ASCII 值为 65)。这个例子表明在 C 中处理字符串有点棘手。字符串表示为数组,但数组在 C 中是二等公民。你不能传递数组,但数组通常由简单的指向它们的第一个元素的指针,您可以传递它。一旦你理解了它,它就会变得非常方便和高效,但一开始会让人感到困惑,需要一些时间来适应。
如果 C 确实 有一个内置的、一流的字符串类型可能会很好,但它没有。因为它没有,所以 C 程序员在处理字符串时总是牢记数组和字符之间的区别。他们在 CS50 中为您提供的“方便”string
typedef 被证明是一个坏主意,因为它实际上根本不方便 - 它只是隐藏了一个重要的区别,最终使事情变得更加混乱。>