2

我使用该功能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如何修复此错误消息?

4

2 回答 2

1

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

*(newItemIDPointer + i)

或者更明显的方法是:

newItemIDPointer[i]

解释一下:假设您有一个指向字符串的指针,称为p

char *p = "ABCDE";

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

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

对于 C 初学者来说,这是最困难的事情之一,一旦您在脑海中清楚地了解了何时操作内存中某个位置的地址以及操作存储在该位置的数据时,C 的其余部分就是相当容易...

于 2019-09-21T20:43:25.747 回答
0

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]))
于 2019-09-21T20:39:50.367 回答