如何修复类型的参数与类型的参数不兼容

时间:2019-09-21 20:35:11

标签: c isspace

我使用功能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) != '\0')
    {
        if (isspace(newItemIDPointer + i))
        {
            count++;
        }
        i++;
    }

在我的代码中实现isspace有什么问题,以及如何解决此错误消息?

2 个答案:

答案 0 :(得分:1)

这是因为表达式newItemIDPointer + i是指向字符串中偏移量i处的字符的指针,而不是该位置的值(字符)。您需要取消引用指针以获取值,例如:

*(newItemIDPointer + i)

或更简单的方法是:

newItemIDPointer[i]

说明:假设您有一个指向字符串的指针,称为p

char *p = "ABCDE";

让我们说指针p恰好有一个值0x4001。那将是字符串中第一个字符的地址,恰好是A的字母ASCII值(我只是完全把这个数字加了,实际上是由操作系统和/或编译器确定实际的内存位置)...

因此,p + 1将给我们0x4002 ..字母B的位置。它不是B的ASCII值,恰好是十进制的66……这就是您要传递给isspace的值。存储在该内存位置的值,而不是地址内存位置。

对于C的初学者来说,这是最困难的事情之一,一旦您掌握了操作内存中某个位置的地址以及处理该位置存储的数据时的头脑, C的代码很容易...

答案 1 :(得分:0)

CBitmap是指向字符串中第newItemIDPointer + i个字符的指针。您不希望指针,而是指针所指向的字符。您需要取消引用指针。

所以替换掉它:

i

使用:

while ((newItemIDPointer + i) != '\0')
{
    if (isspace(newItemIDPointer + i))

或等效地:

while (*(newItemIDPointer + i) != '\0')
{
    if (isspace(*(newItemIDPointer + i)))