关于 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;
source
和 chars
都是指向字符串文字的指针,您不能修改字符串文字,根据语言规则,执行此操作的程序的行为是未定义的。 source
必须声明为字符数组:
char source[] = "hello, people.";
这样,字符串的 副本 存储在数组中,因此它是可修改的。
我猜你的书一定会讨论字符串文字以及你应该如何处理它们。如果不是这样,我们就不能真正称之为本书。
我是初学者。通过书本学习 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;
source
和 chars
都是指向字符串文字的指针,您不能修改字符串文字,根据语言规则,执行此操作的程序的行为是未定义的。 source
必须声明为字符数组:
char source[] = "hello, people.";
这样,字符串的 副本 存储在数组中,因此它是可修改的。
我猜你的书一定会讨论字符串文字以及你应该如何处理它们。如果不是这样,我们就不能真正称之为本书。