如何以多种方式增加指针

  • 本文关键字:方式 增加 指针 c
  • 更新时间 :
  • 英文 :

void squeeze(char s[], int c){
int i, j;
for (i = j = 0; s[i] != ''; i++)
if (s[i] != c)
s[j++] = s[i];
s[j] = '';
}

我正在做K&R: "练习2-4。编写另一个版本的挤压(s1,s2(,删除s1中与字符串s2中任何字符匹配的每个字符。"然而,我正在尝试用指针来实现它。这是我所拥有的:

void squeeze(char *p, char *y){
for(; *p != ''; p++)
if(*p != *y++)
*p++ = *p;
*p++ = '';
}

然而,它并没有实现s[j++]在第一段代码中所做的事情。我能做些什么来做s[j++ ]正在做的事情,但使用指针而不是下标?

您可以从"源"复制到"目的地"。使用详细名称更容易:

void squeeze2(char s[], int c){
char *src = s, *dst = s;
for (; *src != ''; src++) {
if (*src != c) {
*dst++ = *src;
}
}
*dst = '';
}

编写另一个版本的挤压(s1,s2(,删除s1中与字符串s2中任何字符匹配的每个字符。

使用strchr查找字符串中的字符。

void squeeze3(char s[], const char reject[]){
char *src = s, *dst = s;
for (; *src != ''; src++) {
if (strchr(reject, *src) == NULL) {
*dst++ = *src;
}
}
*dst = '';
}

脱离训练:一个没有strchr的版本,它遍历第二个字符串并检查是否有任何字符与*str匹配。如果是,则不会复制。

void squeeze4(char s[], const char reject[]){
char *src = s, *dst = s;
for (; *src != ''; src++) {
const char *r;
for (r = reject; *r != ''; ++r) {
if (*src == *r) {
break;
}
}
if (*r == '') {
*dst++ = *src;
}
}
*dst = '';
}

您正在读取一个var并在没有插入序列点的情况下更改同一个var。这是未定义的行为

但事实并非如此。s[j++] = s[i];访问s的两个不相关的元素,因此如果消除索引,则必然需要两个指针,但只有一个。你需要这样的东西:

*dst++ = *src;

这顺便解决了我提到的第一个问题。

因此,我们得到以下内容:

void squeeze(char *s, char c) {
char *src = s;
char *dst = s;
for (; *src; ++src) {
if (*src != c)
*(dst++) = *src;
}
*dst = 0;
}

最新更新