*(str+i+j)=*(str+i+len+j); 这句代码有问题吗?

时间:2021-08-06 00:37:01
先给大家拜个年,过年好~

RT
我把整个我写的程序也贴出来,是C和指针第六章的编程练习题,如果有书的朋友也可以看115页的第2题。。。
程序是要编写一个函数删除第一个参数中,第二个参数的所有内容。如果第一个参数不包含第二个参数字符串,那么返回0,成功删除返回1。
前面的部分我应该都调试得没有问题了,就剩题目上那句代码,对指针的理解还是比较生硬,不知道哪里出错了

#include <stdio.h>
#include <stdlib.h>

int del_substr(char *str,char const *substr);

int main()
{
    char *str;
    char *substr;
    int i;
 //   printf("input str:\n");
 //   gets(str);
//    puts(str);
//    printf("input substr:\n");
//    gets(substr);
//    puts(substr);
    str="abcedf";
    substr="ced";
//    printf("%d\n",*(substr+3));
    i=del_substr(str,substr);
    printf("%d\n",i);
    puts(str);
    return 0;
}

int
del_substr(char *str,char const *substr){
    int i,j,flag=0,len=0,len_a;
    //计算substr的长度
    for(i=0;*(substr+i)!='\0';i++)
    {
        len++;
    }
    for(i=0;*(str+i)!='\0';i++)
    {
        len_a++;
    }

 //   printf("%d\n",len_a);

    //判断str中是否包括了substr的字符串
    for(i=0;*(str+i)!='\0';i++)
    {
  //      printf("%c\n",*(str+i));
        if(*(str+i)==*substr)
        {
            for(j=0;j<len;j++)
            {
                if(*(str+i+j)!=*(substr+j))
                {
                    break;
                }
                else
                {
                    flag++;
                }
            }

            if(flag==len)
                {
   //                 printf("%d\n",j);
                    for(j=0;j<len_a-i-len+1;j++)
                    {
                        puts("1");
                        printf("%c\n",*(str+i+j));
                        printf("%c\n",*(str+i+len+j));
                        *(str+i+j)=*(str+i+len+j);
                    }
                    return 1;
                }
        }
    }
    if(flag!=len)
    {
        return 0;
    }
}

17 个解决方案

#1


   //判断str中是否包括了substr的字符串
    for(i=0;*(str+i)!='\0';i++)
    {
         flag = 0;
  //      printf("%c\n",*(str+i));
        if(*(str+i)==*substr)
        {
            for(j=0;j<len;j++)
            {
                if(*(str+i+j)!=*(substr+j))
                {
                    break;
                }
                else
                {
                    flag++;
                }
            }
.....


flag 没有清零。嘎嘎

#2


引用 1 楼 malu_1982 的回复:
//判断str中是否包括了substr的字符串
     for(i=0;*(str+i)!='\0';i++)
     {
      flag = 0;
   //      printf("%c\n",*(str+i));
         if(*(str+i)==*substr)
         {
             for(j=0;j <len;j++)
             {
                 if(*(str+i+j)!=*(substr+j))
                 {
                     break;
                 }
                 else
                 {
                     flag++;
                 }
             }
 .....


 flag 没有清零。嘎嘎


    int i,j,flag=0,len=0,len_a;
声明的时候清零了啊555555

#3


在主字符串往后走一个字节的时候 flag 不需要清零吗?
应该在for语句里面清零。

#4


另外 你的 len_a 也没有赋0;

#5


这种代码即使没问题又何必写?
str[i+j] = str[i+j+len]不是比它清晰多了?
你这种代码顶多在说明指针和数组下标关系时有点用处,实际编码中还是应该避免的

#6


char *str;
char *substr;

str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";

#7


引用 3 楼 malu_1982 的回复:
在主字符串往后走一个字节的时候 flag 不需要清零吗?
应该在for语句里面清零。

是啊,这里有双重循环,大循环里首先要将flag赋零

#8


引用 6 楼 guoyu_bo 的回复:
char *str;
char *substr;

str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";


野指针。。。呵呵

#9


引用 6 楼 guoyu_bo 的回复:
char *str;
char *substr;

str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";

这里并没有野指针。
而是*(str+i+j)=*(str+i+len+j);
改变的常量字符串的值而导致的问题。


使用这个程序的问题有三处:
1. flag 没有在 for 里面清零
2. len_a 没有初始化0
3. *(str+i+j)=*(str+i+len+j) 试图改变一个常量字符串的值。str指向的是常量字符串

都改过来就正确了。 呵呵

#10


引用 9 楼 malu_1982 的回复:
引用 6 楼 guoyu_bo 的回复:
char *str;
char *substr;

str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";
 这里并没有野指针。
 而是*(str+i+j)=*(str+i+len+j);
 改变的常量字符串的值而导致的问题。


 使用这个程序的问题有三处:
 1. flag 没有在 for 里面清零
 2. len_a 没有初始化0
 3. *(str+i+j)=*(str+i+len+j) 试图改变一个常量字符串的值。str指向的是常量字符串

 都改过来就正确了。 呵呵


谢谢,我试试

#11


引用 9 楼 malu_1982 的回复:
引用 6 楼 guoyu_bo 的回复:
char *str;
char *substr;

str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";
 这里并没有野指针。
 而是*(str+i+j)=*(str+i+len+j);
 改变的常量字符串的值而导致的问题。


 使用这个程序的问题有三处:
 1. flag 没有在 for 里面清零
 2. len_a 没有初始化0
 3. *(str+i+j)=*(str+i+len+j) 试图改变一个常量字符串的值。str指向的是常量字符串

 都改过来就正确了。 呵呵

抱歉,前面几个问题是我疏忽了呵呵,还想问你一下*(str+i+j)=*(str+i+len+j)这个句子具体要怎么改才好?

貌似下面这两种方法均不行555555
str[i+j]=str[i+j+len];
*(str+i+j)=*(str+i+len+j);

#12


C99是可以通过
指针 str
str[0]这些的

str+i+j是否二维数组?

如果是二维……好像是(str+i)定位到行,然后*j定位到列
应该是(str+i)*j,如果不对,请无视这里

#13


不过……str好像不是二维
str[i+j]=str[i+j+len];
*(str+i+j)=*(str+i+len+j);

应该可以通过的str+i+j
或者你换成
char ab[100];
strcpy(&ab,*(str+i+j));
strcpy(str+i+len+j,&ab);

#14


引用 11 楼 loveqq1943 的回复:
引用 9 楼 malu_1982 的回复:引用 6 楼 guoyu_bo 的回复: char *str; char *substr; str="abcedf"; substr="ced"; 不好,不好又是野指针了,改成 char *str="abcedf"; char *substr="ced"; 这里并没有野指针。 而是*(str+i+j)=*(str+i+len+j); 改变的常量字符串的值而导致的问题。 使用这个程序的问题有三处: 1. flag 没有在 for 里面清零 2. len_a 没有初始化0 3. *(str+i+j)=*(str+i+len+j) 试图改变一个常量字符串的值。str指向的是常量字符串 都改过来就正确了。 呵呵
抱歉,前面几个问题是我疏忽了呵呵,还想问你一下*(str+i+j)=*(str+i+len+j)这个句子具体要怎么改才好?

貌似下面这两种方法均不行555555
str[i+j]=str[i+j+len];
*(str+i+j)=*(str+i+len+j);


*(str+i+j)=*(str+i+len+j);
你这个地方的错误不是你写法错误的原因,而是存储错误。

因为之前你的赋值语句 str = "abcdef";表示你把str指向了一个常量字符串
而表达式*(str+i+j)=*(str+i+len+j); 相当于修改常量字符串中某个元素的值,当然会错了,常量不能修改。

#15


我琢磨着楼主兄弟是不是觉得定义了str想把那个cde给去掉但是改不了它的内容啊?改不了的原因14楼是正解。就是因为它的定义是常量字符串。存储的时候在只读存储区(即使你没有加const)。
如果想改str的内容最后打印的话那需要在定义的时候将其定义在栈中,例如:
    char *str;
    char str0[] = "abcedf";
    char *substr;
    int i;
    str = str0;
    substr="ced";
楼主可以试试。

#16



    
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int del_substr(char *str,char *substr);

int main()
{
    char *str;
    char *substr;
    
    str="abcedf";
    substr="ced";
    
printf("%d\n",(del_substr(str,substr))/3);
    
    return 0;
}

int del_substr(char *str,char *substr)
{
    int toal=0;

char *bsub =substr;
for (;*str!=NULL;str++)
{
for (;*substr!=NULL;substr++)
{
if (*str==*substr)
{
str++;
}


}
substr="ced";
toal++;

}
return toal;
}

#17


代码好乱,看不来。我看不懂

#1


   //判断str中是否包括了substr的字符串
    for(i=0;*(str+i)!='\0';i++)
    {
         flag = 0;
  //      printf("%c\n",*(str+i));
        if(*(str+i)==*substr)
        {
            for(j=0;j<len;j++)
            {
                if(*(str+i+j)!=*(substr+j))
                {
                    break;
                }
                else
                {
                    flag++;
                }
            }
.....


flag 没有清零。嘎嘎

#2


引用 1 楼 malu_1982 的回复:
//判断str中是否包括了substr的字符串
     for(i=0;*(str+i)!='\0';i++)
     {
      flag = 0;
   //      printf("%c\n",*(str+i));
         if(*(str+i)==*substr)
         {
             for(j=0;j <len;j++)
             {
                 if(*(str+i+j)!=*(substr+j))
                 {
                     break;
                 }
                 else
                 {
                     flag++;
                 }
             }
 .....


 flag 没有清零。嘎嘎


    int i,j,flag=0,len=0,len_a;
声明的时候清零了啊555555

#3


在主字符串往后走一个字节的时候 flag 不需要清零吗?
应该在for语句里面清零。

#4


另外 你的 len_a 也没有赋0;

#5


这种代码即使没问题又何必写?
str[i+j] = str[i+j+len]不是比它清晰多了?
你这种代码顶多在说明指针和数组下标关系时有点用处,实际编码中还是应该避免的

#6


char *str;
char *substr;

str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";

#7


引用 3 楼 malu_1982 的回复:
在主字符串往后走一个字节的时候 flag 不需要清零吗?
应该在for语句里面清零。

是啊,这里有双重循环,大循环里首先要将flag赋零

#8


引用 6 楼 guoyu_bo 的回复:
char *str;
char *substr;

str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";


野指针。。。呵呵

#9


引用 6 楼 guoyu_bo 的回复:
char *str;
char *substr;

str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";

这里并没有野指针。
而是*(str+i+j)=*(str+i+len+j);
改变的常量字符串的值而导致的问题。


使用这个程序的问题有三处:
1. flag 没有在 for 里面清零
2. len_a 没有初始化0
3. *(str+i+j)=*(str+i+len+j) 试图改变一个常量字符串的值。str指向的是常量字符串

都改过来就正确了。 呵呵

#10


引用 9 楼 malu_1982 的回复:
引用 6 楼 guoyu_bo 的回复:
char *str;
char *substr;

str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";
 这里并没有野指针。
 而是*(str+i+j)=*(str+i+len+j);
 改变的常量字符串的值而导致的问题。


 使用这个程序的问题有三处:
 1. flag 没有在 for 里面清零
 2. len_a 没有初始化0
 3. *(str+i+j)=*(str+i+len+j) 试图改变一个常量字符串的值。str指向的是常量字符串

 都改过来就正确了。 呵呵


谢谢,我试试

#11


引用 9 楼 malu_1982 的回复:
引用 6 楼 guoyu_bo 的回复:
char *str;
char *substr;

str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";
 这里并没有野指针。
 而是*(str+i+j)=*(str+i+len+j);
 改变的常量字符串的值而导致的问题。


 使用这个程序的问题有三处:
 1. flag 没有在 for 里面清零
 2. len_a 没有初始化0
 3. *(str+i+j)=*(str+i+len+j) 试图改变一个常量字符串的值。str指向的是常量字符串

 都改过来就正确了。 呵呵

抱歉,前面几个问题是我疏忽了呵呵,还想问你一下*(str+i+j)=*(str+i+len+j)这个句子具体要怎么改才好?

貌似下面这两种方法均不行555555
str[i+j]=str[i+j+len];
*(str+i+j)=*(str+i+len+j);

#12


C99是可以通过
指针 str
str[0]这些的

str+i+j是否二维数组?

如果是二维……好像是(str+i)定位到行,然后*j定位到列
应该是(str+i)*j,如果不对,请无视这里

#13


不过……str好像不是二维
str[i+j]=str[i+j+len];
*(str+i+j)=*(str+i+len+j);

应该可以通过的str+i+j
或者你换成
char ab[100];
strcpy(&ab,*(str+i+j));
strcpy(str+i+len+j,&ab);

#14


引用 11 楼 loveqq1943 的回复:
引用 9 楼 malu_1982 的回复:引用 6 楼 guoyu_bo 的回复: char *str; char *substr; str="abcedf"; substr="ced"; 不好,不好又是野指针了,改成 char *str="abcedf"; char *substr="ced"; 这里并没有野指针。 而是*(str+i+j)=*(str+i+len+j); 改变的常量字符串的值而导致的问题。 使用这个程序的问题有三处: 1. flag 没有在 for 里面清零 2. len_a 没有初始化0 3. *(str+i+j)=*(str+i+len+j) 试图改变一个常量字符串的值。str指向的是常量字符串 都改过来就正确了。 呵呵
抱歉,前面几个问题是我疏忽了呵呵,还想问你一下*(str+i+j)=*(str+i+len+j)这个句子具体要怎么改才好?

貌似下面这两种方法均不行555555
str[i+j]=str[i+j+len];
*(str+i+j)=*(str+i+len+j);


*(str+i+j)=*(str+i+len+j);
你这个地方的错误不是你写法错误的原因,而是存储错误。

因为之前你的赋值语句 str = "abcdef";表示你把str指向了一个常量字符串
而表达式*(str+i+j)=*(str+i+len+j); 相当于修改常量字符串中某个元素的值,当然会错了,常量不能修改。

#15


我琢磨着楼主兄弟是不是觉得定义了str想把那个cde给去掉但是改不了它的内容啊?改不了的原因14楼是正解。就是因为它的定义是常量字符串。存储的时候在只读存储区(即使你没有加const)。
如果想改str的内容最后打印的话那需要在定义的时候将其定义在栈中,例如:
    char *str;
    char str0[] = "abcedf";
    char *substr;
    int i;
    str = str0;
    substr="ced";
楼主可以试试。

#16



    
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int del_substr(char *str,char *substr);

int main()
{
    char *str;
    char *substr;
    
    str="abcedf";
    substr="ced";
    
printf("%d\n",(del_substr(str,substr))/3);
    
    return 0;
}

int del_substr(char *str,char *substr)
{
    int toal=0;

char *bsub =substr;
for (;*str!=NULL;str++)
{
for (;*substr!=NULL;substr++)
{
if (*str==*substr)
{
str++;
}


}
substr="ced";
toal++;

}
return toal;
}

#17


代码好乱,看不来。我看不懂

#18