如何修复类型参数与类型参数不兼容
How to fix argument of type is incompatible with parameter of type
我使用函数 isspace
在单词中搜索空格。问题是程序构建时我收到一条错误消息:
"argument of type char* is incompatible with parameter of type int"
int const bufferSize = 256;
newItemIDPointer = (char*)malloc(bufferSize * sizeof(char));
if (newItemIDPointer == NULL)
{
printf("Didnt allocate memory!");
exit(EXIT_SUCCESS);
}
printf("Enter new Item ID: ");
scanf_s(" %[^'\n']s", newItemIDPointer, bufferSize);
stringLength = strlen(newItemIDPointer);
newItemIDPointer = (char*)realloc(newItemIDPointer, size_t(stringLength + 1));
int i = 0;
int count = 0;
while ((newItemIDPointer + i) != '[=10=]')
{
if (isspace(newItemIDPointer + i))
{
count++;
}
i++;
}
我的代码中 isspace
的实现有什么问题,我该如何修复此错误消息?
newItemIDPointer + i
是指向字符串中第 i
个字符的指针。您不需要指针,而是它指向的字符。您需要取消引用指针。
所以替换这个:
while ((newItemIDPointer + i) != '[=10=]')
{
if (isspace(newItemIDPointer + i))
与:
while (*(newItemIDPointer + i) != '[=11=]')
{
if (isspace(*(newItemIDPointer + i)))
或等价地:
while (newItemIDPointer[i] != '[=12=]')
{
if (isspace(newItemIDPointer[i]))
这是因为您的表达式 newItemIDPointer + i
是指向字符串中偏移量 i
处字符的指针,而不是该位置处的值(字符)。您需要取消引用指针以获取值,例如:
*(newItemIDPointer + i)
或者更明显的方法是:
newItemIDPointer[i]
解释一下:假设您有一个指向字符串的指针,名为 p
:
char *p = "ABCDE";
假设指针 p
恰好有一个值 0x4001
。那将是字符串中第一个字符的地址,它恰好是 A
的字母 ASCII 值(我只是完全编造了这个数字,实际上操作系统 and/or 编译器确定实际内存位置)...
那么,p + 1
会给我们 0x4002
.. 字母 B
的位置。它不是 B
的 ASCII 值,它恰好是十进制的 66
...这就是您要传递给 isspace 的值。存储在该内存位置的值,而不是地址内存位置。
对于 C 初学者来说,这是最困难的事情之一,一旦您对何时操作内存中某个位置的地址以及何时操作存储在该位置的数据有了清晰的认识, C 的其余部分非常简单...
我使用函数 isspace
在单词中搜索空格。问题是程序构建时我收到一条错误消息:
"argument of type char* is incompatible with parameter of type int"
int const bufferSize = 256;
newItemIDPointer = (char*)malloc(bufferSize * sizeof(char));
if (newItemIDPointer == NULL)
{
printf("Didnt allocate memory!");
exit(EXIT_SUCCESS);
}
printf("Enter new Item ID: ");
scanf_s(" %[^'\n']s", newItemIDPointer, bufferSize);
stringLength = strlen(newItemIDPointer);
newItemIDPointer = (char*)realloc(newItemIDPointer, size_t(stringLength + 1));
int i = 0;
int count = 0;
while ((newItemIDPointer + i) != '[=10=]')
{
if (isspace(newItemIDPointer + i))
{
count++;
}
i++;
}
我的代码中 isspace
的实现有什么问题,我该如何修复此错误消息?
newItemIDPointer + i
是指向字符串中第 i
个字符的指针。您不需要指针,而是它指向的字符。您需要取消引用指针。
所以替换这个:
while ((newItemIDPointer + i) != '[=10=]')
{
if (isspace(newItemIDPointer + i))
与:
while (*(newItemIDPointer + i) != '[=11=]')
{
if (isspace(*(newItemIDPointer + i)))
或等价地:
while (newItemIDPointer[i] != '[=12=]')
{
if (isspace(newItemIDPointer[i]))
这是因为您的表达式 newItemIDPointer + i
是指向字符串中偏移量 i
处字符的指针,而不是该位置处的值(字符)。您需要取消引用指针以获取值,例如:
*(newItemIDPointer + i)
或者更明显的方法是:
newItemIDPointer[i]
解释一下:假设您有一个指向字符串的指针,名为 p
:
char *p = "ABCDE";
假设指针 p
恰好有一个值 0x4001
。那将是字符串中第一个字符的地址,它恰好是 A
的字母 ASCII 值(我只是完全编造了这个数字,实际上操作系统 and/or 编译器确定实际内存位置)...
那么,p + 1
会给我们 0x4002
.. 字母 B
的位置。它不是 B
的 ASCII 值,它恰好是十进制的 66
...这就是您要传递给 isspace 的值。存储在该内存位置的值,而不是地址内存位置。
对于 C 初学者来说,这是最困难的事情之一,一旦您对何时操作内存中某个位置的地址以及何时操作存储在该位置的数据有了清晰的认识, C 的其余部分非常简单...