Как исправить аргумент типа несовместим с параметром типа - PullRequest
2 голосов
/ 21 сентября 2019

Я использовал функцию 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 ]

1 голос
/ 21 сентября 2019

Это потому, что ваше выражение newItemIDPointer + i является указателем на символ со смещением i в строке, а не значением (символом) в этом месте.Вам нужно разыменовать указатель, чтобы получить значение, например:

*(newItemIDPointer + i)

Или более очевидный способ сделать это:

newItemIDPointer[i]

Чтобы объяснить: допустим, у вас есть указательв строку, называемую p:

char *p = "ABCDE";

Предположим, что указатель p имеет значение 0x4001.Это будет адрес первого символа в вашей строке, который соответствует значению буквы ASCII A (я просто полностью увеличил это число, на практике операционная система и / или компилятор определяют фактическое расположение в памяти)...

Итак, p + 1 даст нам 0x4002 .. расположение буквы B.Это НЕ значение ASCII B, которое в десятичном виде равно 66. Это то, что вы хотите передать в isspace ... значение, хранящееся в этой ячейке памяти, а не адрес ячейки памяти.

Это одна из самых сложных задач для начинающих в C, когда вы получаете хорошее зрелище в голове, когда вы манипулируете адресом места в памяти и когда вы манипулируете данными, хранящимися в этом.место, остальная часть C довольно легко ...

0 голосов
/ 21 сентября 2019

newItemIDPointer + i - указатель на i '-й символ в строке.Вы не хотите указатель, но символ, на который он указывает.Вы должны разыменовать указатель.

Замените это:

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

на:

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

Или эквивалентно:

while (newItemIDPointer[i] != '\0')
{
    if (isspace(newItemIDPointer[i]))
...