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