现在的位置: 首页 > 综合 > 正文

09.11.12学习日记

2018年10月25日 ⁄ 综合 ⁄ 共 1495字 ⁄ 字号 评论关闭

 昨晚做了教材6-22题目,原题:编写函数int index(char *s,char *t),返回字符串t在字符串s中出现的最左边的位置,如果在s中没有与t匹配的字串,就返回-1。自己做的代码:

#include<iostream>
#include<cstring>
using namespace std;
int index(char *s,char *t)
{int i,j,J,len1,len2,flag=-1,p;
len1=strlen(s);
len2=strlen(t);
for(j=0;len1-j>=len2;j++)
{i=0;
J=j;
while(s[J]==t[i]&&t[i]!='/0')
{i++;
J++;}
if(i==len2)
{p=j;
flag=1;
break;}}
if(flag==1)
return j+1;
else return -1;}
int main()
{char str1[100],str2[100];
 gets(str1);
 gets(str2);
 cout<<index(str1,str2)<<endl;
return 0;}

这里还是没有用动态分配内存(以后要尽量用动态分配),不过刚开始的时候取字符串的个数时候用了sizeof函数 输出一直是-1后来调试才知道原来sizeof取出的是数组的空间大小 而非字符串的个数 后来改成strlen函数就行了 后来百度以下sizeof和strlen的区别,果然不出我所料,为了加深理解和复习 下面转载一些百度上的资料:

#include "stdio.h"
#include "string.h"
void main()
{
char a1[10]={'a','b','c','d'};
char a2[]={'x','y','z'};
char a3[]="sdfg";
char a4[4]="abc";
char a5[4]={'e','f','g','h'};

printf("%d,%d/n",sizeof(a1),strlen(a1));
printf("%d,%d/n",sizeof(a2),strlen(a2));
printf("%d,%d/n",sizeof(a3),strlen(a3));
printf("%d,%d/n",sizeof(a4),strlen(a4));
printf("%d,%d/n",sizeof(a5),strlen(a5));}

10,4
3,8
5,4
4,3
4,7
这是我运行出来的结果,有的地方不同电脑会不同,后面会提到
sizeof是计算字节数,字符变量是1个字节,所以有几个字符变量就是几个字节
strlen是计算字符串长度,不过字符串末尾的/0是不会算进去的
我逐一说吧
对于a1,a1定义长度是10,所以占字节数也就是10,你初始化了4个元素,后六个就是0,也就是/0,因为/0的值就是0。所以a1作为一个字符串,实际是
"abcd/0/0/0/0/0/0",所以字符串长度是4。
对于a2,你用的是不说明数组长度并且用逐一元素初始化的初始化方法,这样你初始化了几个元素,这个数组的长度就是多少。所以长度是3,但是a2的3个元素都被占满了,没有/0,所以作为字符串来讲编译器找不到结束符,就会出现一些乱七八糟的东西,你可以用puts(a2)来查看一下就知道了。不同电脑结果会不一样。
对于a3和a4,用字符串来初始化字符数组的时候,只要长度足够或者默认长度,编译器会自动加上一个/0做结束符
a5和a2差不多,也是没有/0导致的,同样可以用puts(a5)来查询
所谓字符串a,就是从a的地址开始往后,到第一个/0之间的内容

 上面的解析还是比较详细的。。

 

【上篇】
【下篇】

抱歉!评论已关闭.