首页 > 代码库 > 第七天:C基础之字符串操作与结构体

第七天:C基础之字符串操作与结构体

  培训的第七天,来成都的十天。来的一行人都觉得好累。也许是因为天气原因,也许是因为今天所讲的内容开始不好理解了。

  早上主要讲了字符串相关的两个函数的操作。strstr和strtok ,strstr前面接触过,是查找子串,返回地址。strtok是使用分隔符分割字符串。今天的第一个程序就是不使用这两个函数实现将字符串中的单词分割出来存在二维数组中。这个使用一次循环就能够完成,循环遍历遇到空格是用‘\0‘代替。代码如下:

 1 #include<stdio.h> 2 #include<stdlib.h> 3  4 int main() 5 { 6     char *p ="The functions in the printf family" ; 7     char arr[6][20]={0};  8  9     int i,j,n=0;10     for(i=0,j=0;i<strlen(p);i++,j++){11         *(*(arr+n)+j) = *(p+i);12             if(*(p+i)== ){13                 n++;14                 *(*(arr+n)+j)= \0;15                 j=-1;16         17             }18     19         20     }21     printf("%s\n",*arr);22     printf("%s\n",*(arr+1));23     printf("%s\n",*(arr+2));24     printf("%s\n",*(arr+3));25     printf("%s\n",*(arr+4));26     printf("%s\n",*(arr+5));27 28 } 
分隔单词

    后面花了比较长时间使用这两个函数完成上面程序的功能。先贴代码:

 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4  5 int main() 6 { 7     char *p ="The functions in the printf family" ; 8     char brr[1024]={0}; 9     char *r = brr;10     char *str = NULL;11     strcpy(r,p);12 13 //    printf("%s\n",strtok(p,k)); 字符串放在只读区,不能改变值。14     15     char *tmp;    16     do17     {    18           str = strstr(r," ");19           tmp = strtok(r," ");20           r = str + 1;21           printf("%s\n",tmp);22     }while(str);23     24     

  使用strtok和strstr很容易出现段错误 (就是内存分配出错),代码13行中,因为 p中保存的地址是在常量区的,使用strtok函数会把与截段符匹配的区域用‘\0’代替。要改变字符串的值,而常量区的值是不能够改变的。所以运行13行代码会出现段错误。

     上面程序中的循环体今天写的时候有个错误一直找不出来,就是我写的时候 没有区分 str和r ,都是用r来实现,结果逻辑没弄清楚,认为第19行strstr第一个参数和20行strtok第一个参数是一个值。

  今天的重点在结构体的介绍和使用。有两个小知识点,一个是字节对齐,还有是位域

  先是结构体内的字节对齐,遵循三个原则,1 :最大的字节不能超过系统的位数所占字节。 2. 要分配的字节要被已分配直接整除,3,已分配的最大的要被总的分配的整除。
       位域的作用是极大的节省空间 比如  结构体中定义 char : 3  char : 2 这两个共占一个字节。

  重点在于 . 和 -> 的区别, 如果前面是内存用 .  如果前面是 地址就用 ->

 

第七天:C基础之字符串操作与结构体