c 指针下标问题 有点不太明白 请大家帮忙解释一下

时间:2022-02-23 21:58:53
[size=14px]

//写了个跳过多个空格 为 一个的 函数
void thkg(char *t ,char *p)
{
    while(*p != '\0')
    {
         if(*p !=' ' || *(p+1) != ' ') //为什么 这里的 *(p+1)  不能用 *(++p) 或 *(p++) 呢? 编译环境 gcc 4.7.1
         {
             *t++ = *p;
         }
         p++;
    }
    *t='\0';
}
[/size]


8 个解决方案

#1


++p和p++都会改变p的值,所以不用。

#2


用p++的话, if(*p !=' ' || *(p++) != ' ') ||前后两个部分的是值判断是一样的,没有意义。
++p可以用,只不过要对应修改,而且应该会比你现在这样效率更高

#3


++p可以,p++不可以,两者都会改变p的值,但是之后的 *t++ = *p;会用到p的值。需要看程序需要不需要p的值改变

#4


你要写成如下这样也是可以滴


void thkg(char *t ,char *p)
{
    while(*p != '\0')
    {
         if(*p !=' ' || *(p+1) != ' ') 
         {
             *t++ = *p++;
         }
         else
              p++;
    }
    *t='\0';
}

#5


1楼的回答是正确的

#6


修改如下:

#include <stdio.h>
char *eatspace(char *d, char *s)
{
char *p = d;
if(NULL == d || NULL == s) return d;
while(*s)
{
if(*s != ' ') *d++ = *s;
s++;
}
*d = '\0';
return p;
}
char *leaveOneSpace(char *d, char *s)
{
char *p = d;
if(NULL == d || NULL == s) return d;
*d++ = *s++;
while(*s)
{
if(' ' == *(d - 1) && ' ' == *s)
;
else
*d++ = *s;
s++;
}
*d = '\0';
return p;
}
int main(void)
{
char s[] = "abc  def";
char d[20];
//printf("eatspace...\n");
//eatspace(d, s);
//printf("s=%s\nd=%s\n", s, d);
printf("leaveOneSpace...\n");
leaveOneSpace(d, s);
printf("s=%s\nd=%s\n", s, d);
return 0;
}

#7


引用 1 楼 掌心的呵护的回复:
++p和p++都会改变p的值,所以不用。

++p和p++都会改变p的值,所以不用。
++p和p++都会改变p的值,所以不用。
++p和p++都会改变p的值,所以不用。
不好意思 手机屏幕太小点错了。 这里的 p++ 先执行附近的运算再自增 这个好理解 但++p 是先自增 在这条语句中 它们与 p+1 有什么区别

#8


引用 7 楼 eddition512 的回复:
Quote: 引用 1 楼 掌心的呵护的回复:
++p和p++都会改变p的值,所以不用。

不好意思 手机屏幕太小点错了。 这里的 p++ 先执行附近的运算再自增 这个好理解 但++p 是先自增 在这条语句中 它们与 p+1 有什么区别


如下三句:
if(*p !=' ' || *(p+1) != ' ') //为什么 这里的 *(p+1)  不能用 *(++p) 或 *(p++) 呢? 编译环境 gcc 4.7.1
{
     *t++ = *p;
}
p++;
在if判断语句这一行,可以使用++p来替换,但p的值被改变了(p=p+1),需要将下面的两句赋值修改为之前p的值;或者将最后一句去掉(因为p已完成自增), *t++ = *p修改为 *t++ = *(p-1);

#1


++p和p++都会改变p的值,所以不用。

#2


用p++的话, if(*p !=' ' || *(p++) != ' ') ||前后两个部分的是值判断是一样的,没有意义。
++p可以用,只不过要对应修改,而且应该会比你现在这样效率更高

#3


++p可以,p++不可以,两者都会改变p的值,但是之后的 *t++ = *p;会用到p的值。需要看程序需要不需要p的值改变

#4


你要写成如下这样也是可以滴


void thkg(char *t ,char *p)
{
    while(*p != '\0')
    {
         if(*p !=' ' || *(p+1) != ' ') 
         {
             *t++ = *p++;
         }
         else
              p++;
    }
    *t='\0';
}

#5


1楼的回答是正确的

#6


修改如下:

#include <stdio.h>
char *eatspace(char *d, char *s)
{
char *p = d;
if(NULL == d || NULL == s) return d;
while(*s)
{
if(*s != ' ') *d++ = *s;
s++;
}
*d = '\0';
return p;
}
char *leaveOneSpace(char *d, char *s)
{
char *p = d;
if(NULL == d || NULL == s) return d;
*d++ = *s++;
while(*s)
{
if(' ' == *(d - 1) && ' ' == *s)
;
else
*d++ = *s;
s++;
}
*d = '\0';
return p;
}
int main(void)
{
char s[] = "abc  def";
char d[20];
//printf("eatspace...\n");
//eatspace(d, s);
//printf("s=%s\nd=%s\n", s, d);
printf("leaveOneSpace...\n");
leaveOneSpace(d, s);
printf("s=%s\nd=%s\n", s, d);
return 0;
}

#7


引用 1 楼 掌心的呵护的回复:
++p和p++都会改变p的值,所以不用。

++p和p++都会改变p的值,所以不用。
++p和p++都会改变p的值,所以不用。
++p和p++都会改变p的值,所以不用。
不好意思 手机屏幕太小点错了。 这里的 p++ 先执行附近的运算再自增 这个好理解 但++p 是先自增 在这条语句中 它们与 p+1 有什么区别

#8


引用 7 楼 eddition512 的回复:
Quote: 引用 1 楼 掌心的呵护的回复:
++p和p++都会改变p的值,所以不用。

不好意思 手机屏幕太小点错了。 这里的 p++ 先执行附近的运算再自增 这个好理解 但++p 是先自增 在这条语句中 它们与 p+1 有什么区别


如下三句:
if(*p !=' ' || *(p+1) != ' ') //为什么 这里的 *(p+1)  不能用 *(++p) 或 *(p++) 呢? 编译环境 gcc 4.7.1
{
     *t++ = *p;
}
p++;
在if判断语句这一行,可以使用++p来替换,但p的值被改变了(p=p+1),需要将下面的两句赋值修改为之前p的值;或者将最后一句去掉(因为p已完成自增), *t++ = *p修改为 *t++ = *(p-1);