`

C language

阅读更多
2009-3-3 by hayabusa
   这两天一直在写C代码,也忘了把东西粘上来,顺便把写得函数发上来吧.
1.讲义
  1.1
    1.1.1常指针与指针常量
const int* p;*p不能变
int* const p;p不能变
  1.1.2数组
  1.1.3字符串
字符串的所有处理都要仔细分析,
    并且对于内存泄漏问题要相当地关注。
strcat
strlen
str_upp
str_low
list
  1.1.4struct
   1.2
stack:局部变量
静态存储区:全局变量,static变量
heap 堆:自己创建,自己销毁
malloc
free
注意自己释放的同时取消指针的指向。

void f(char** str){
   *str=(char*)malloc(10*sizeof(char));
   printf("%s",*str);
}
int main(void){
char *p;
f(&p);
return 0;
}
2.作业
   2.1 把前边练习的结果改成Hello World
//output.c
//这里要注意的是常量存储在常量存储区内,也是在程序结束是由系统回收。
#include<stdio.h>
char* show(void){
printf("file:output.c-------functionshow: ");
return "Hello World";
}
//test.c
#include "output.c"
int main(void){
  char *p=show();
  printf("%s\n",p);
  return 0;
}
   2.2 统计给定字符串中的数字、字母、空格和其它字符出现的次数
#include<stdio.h>
int main(void){
char string[]="abckdksslaeksdfj&283sdf413asdf4~ L LA ^*@^#&!";
char* p=string;
int num=0,character=0,other=0,space=0;
while(*p){
  if(*p == ' ')space++;
else if(*p>='0' && *p<='9')num++;
else if((*p>='A' && *p<='Z')||(*p>='a' && *p<='z'))character++;
else other++;
    p++;
}
printf("number-character-space-other:%d-%d-%d-%d\n",num,character,space,other);
return 0;
}
   2.3 编写函数实现计算字符串长度的功能
/*
*     caculate the length of a string
  */
int str_len(const char *string){
int i=0;
while(*(string+i))i++;
return i-1;
}
   2.4 编写函数实现字符串合并的功能。两个输入字符串作为参数,返回合并后的结果。(内存泄露问题,怎么解决)
       笨啦,后边两种不能解决内存泄漏啊;而且感觉多余一套。看了codesearch上的代码,都觉得脸红啊,算啦,贴上吧,就当是教训了。
/*
*                 concatenate two strings
*/
char* str_cat(char* org_str,const char* ext_str){
char* const p;
int org_len=str_len(org_str);
while(*((org_str++)+org_len)=*ext_str++);
return p;
}
/*                     concatenate two strings
* size represent that it will use at almost n characters
*/
char* str_ncat(char *org_str,const char *ext_str,int size){
char* const p=org_str;
int org_len=str_len(org_str);
int i=0;
while((*((org_str++)+org_len)=*ext_str++)&&(++i)<size);
if(i>=size)*(org_str+org_len)='\0';
return p;
}
/*
* concatenate two strings by accessing memory safely.
* if the orginal string is an array,only bite off the more
* characters of the extended string;but the orginal string
* is a char point,renew a block of memory for the orginal,
* that can hold all the characters of these two strings.
  */
char* str_cata(char *org_str,const char *ext_str,int length){
char* const p=org_str;
int i=str_len(org_str);
while((*(org_str+i)=*ext_str++)&&(++i)<length-1);
*(org_str+i)='\0';
return p;
}
char* str_cats(char** org_str,const char *ext_str,int length){
int org_len=str_len(*org_str);
int ext_len=str_len(ext_str);
if(org_len+ext_len>length-1){
if(!(*org_str=realloc(*org_str,(org_len+ext_len+1)*sizeof(char))))
        exit(OVERFLOW);
length=org_len+ext_len+1;
}
char* const p=*org_str;
char* q=*org_str+org_len;
while(*q++=*ext_str++);
return p;
}
   2.5 编写函数实现字符串拷贝功能

char* str_cpy(char* org_str,char* ext_str){
char* const p=org_str;
while(*org_str++=*ext_str++);
return p;
}
关键的是3-5题
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics