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 没有清零。嘎嘎
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
int i,j,flag=0,len=0,len_a;
声明的时候清零了啊555555
#3
在主字符串往后走一个字节的时候 flag 不需要清零吗?
应该在for语句里面清零。
应该在for语句里面清零。
#4
另外 你的 len_a 也没有赋0;
#5
这种代码即使没问题又何必写?
str[i+j] = str[i+j+len]不是比它清晰多了?
你这种代码顶多在说明指针和数组下标关系时有点用处,实际编码中还是应该避免的
str[i+j] = str[i+j+len]不是比它清晰多了?
你这种代码顶多在说明指针和数组下标关系时有点用处,实际编码中还是应该避免的
#6
char *str;
char *substr;
str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";
char *substr;
str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";
#7
是啊,这里有双重循环,大循环里首先要将flag赋零
#8
野指针。。。呵呵
#9
这里并没有野指针。
而是*(str+i+j)=*(str+i+len+j);
改变的常量字符串的值而导致的问题。
使用这个程序的问题有三处:
1. flag 没有在 for 里面清零
2. len_a 没有初始化0
3. *(str+i+j)=*(str+i+len+j) 试图改变一个常量字符串的值。str指向的是常量字符串
都改过来就正确了。 呵呵
#10
谢谢,我试试
#11
抱歉,前面几个问题是我疏忽了呵呵,还想问你一下*(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,如果不对,请无视这里
指针 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);
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
*(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";
楼主可以试试。
如果想改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
#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 没有清零。嘎嘎
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
int i,j,flag=0,len=0,len_a;
声明的时候清零了啊555555
#3
在主字符串往后走一个字节的时候 flag 不需要清零吗?
应该在for语句里面清零。
应该在for语句里面清零。
#4
另外 你的 len_a 也没有赋0;
#5
这种代码即使没问题又何必写?
str[i+j] = str[i+j+len]不是比它清晰多了?
你这种代码顶多在说明指针和数组下标关系时有点用处,实际编码中还是应该避免的
str[i+j] = str[i+j+len]不是比它清晰多了?
你这种代码顶多在说明指针和数组下标关系时有点用处,实际编码中还是应该避免的
#6
char *str;
char *substr;
str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";
char *substr;
str="abcedf";
substr="ced";
不好,不好
又是野指针了,改成
char *str="abcedf";
char *substr="ced";
#7
是啊,这里有双重循环,大循环里首先要将flag赋零
#8
野指针。。。呵呵
#9
这里并没有野指针。
而是*(str+i+j)=*(str+i+len+j);
改变的常量字符串的值而导致的问题。
使用这个程序的问题有三处:
1. flag 没有在 for 里面清零
2. len_a 没有初始化0
3. *(str+i+j)=*(str+i+len+j) 试图改变一个常量字符串的值。str指向的是常量字符串
都改过来就正确了。 呵呵
#10
谢谢,我试试
#11
抱歉,前面几个问题是我疏忽了呵呵,还想问你一下*(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,如果不对,请无视这里
指针 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);
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
*(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";
楼主可以试试。
如果想改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
代码好乱,看不来。我看不懂