关于 C 练习 6.18-2 的指针,我的解决方案不起作用

Pointers On C exercises 6.18-2, my solution does not work

我是初学者。通过书本学习 C,下面是我对 6.18-2 的解决方案,写了一个从源代码中删除 substr 的函数 string.It 不起作用。

#include <stdio.h>

char *find_char(char const *source, char const *chars)
{
    int offset = 0;

    if (source == NULL || chars == NULL || *source == '[=10=]' || *chars == '[=10=]')
        return NULL;
    
    while (*chars != '[=10=]')
    {
        while (*(source + offset) != '[=10=]')
            if (*(source + offset++) == *chars)
                return source + --offset;

        chars++;
        offset = 0;
    }

    return NULL;
}

int del_substr(char *str, char const *substr)
{
    int offset = 0;
    int suboffset = 0;

    if (str == NULL || substr == NULL)
        return 0;
    while(*(str + offset) != '[=10=]')
    {
        while( *(str + offset) != '[=10=]' && *(str + offset++) == *(substr + suboffset++));
        if(*(substr + suboffset) == '[=10=]')
        {
            while ((*(str + offset - suboffset) = *(str + offset++)) != '[=10=]')
            ;
            return 1;
        }
        offset++;
        suboffset = 0;
    }

    return 0;
}


int main()
{
    char *source = "hello, people.";
    char *chars = "peo";

    del_substr(source, chars);
    printf("result:%s\n", source);

    return 0;
}

您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。

所以在 main 中你需要使用声明

char source[] = "hello, people.";

而不是

char *source = "hello, people.";

这样的说法

while( *(str + offset) != '[=12=]' && *(str + offset++) == *(substr + suboffset++));

其中读取变量偏移量,同时使用后缀增量运算符调用未定义行为。

这个增量

offset++;

跳过许多字符。你需要写

offset = offset - suboffset + 1;

sourcechars 都是指向字符串文字的指针,您不能修改字符串文字,根据语言规则,执行此操作的程序的行为是未定义的。 source 必须声明为字符数组:

char source[] = "hello, people.";

这样,字符串的 副本 存储在数组中,因此它是可修改的。

我猜你的书一定会讨论字符串文字以及你应该如何处理它们。如果不是这样,我们就不能真正称之为本书