标签:
题目:
有一个字符串开头或结尾含有n个空格(" abcdefgdddd "),欲去掉前后空格,返回一个新字符串。
1 // 字符串两头堵模型
2 int TrimSpaceStr(char *p, char *buf)
3 {
4 int rv = 0;
5 char *str = p;
6 int i = 0; // 搜索指针变量,从字符串头部开始
7 int j = strlen(str) - 1;// 搜索指针变量,从字符串尾部开始
8 int len = 0; // 字符串的有效长度
9
10 if(str==NULL || buf==NULL)
11 {
12 rv = -1;
13 printf("Function TrimSpaceStr() check (str==NULL || buf==NULL) Error: %d", rv);
14 return rv;
15 }
16
17 while(isspace(str[i]) && i<j)
18 {
19 i++;
20 }
21
22 while(isspace(str[j]) && j>=0)
23 {
24 j--;
25 }
26
27 len = j-i+1;
28
29 strncpy(buf, str+i, len);
30
31 buf[len] = ‘\0‘;
32 return rv;
33 }
34 int main()
35 {
36 int ret = 0;
37
38 // 在栈区分配了内存空间,拷贝了一份
39 char str[] = " abcdefgdddd ";
40
41 char p1[20];
42
43 ret = TrimSpaceStr(str, p1);
44
45 if(ret != 0)
46 {
47 printf("Function DelSpace() Error: %d \n", ret);
48 }
49
50 printf("After Delete Space: %s\n", p1);
51
52 return 0;
53 }
分析: 先看函数int TrimSpaceStr(char *p, char *buf), 在主调函数中分配内存,传进被调用函数, 在char *p前面最好加const, 可以防止意外修改源字符串
再看int main(), 将字符串拷贝进临时分配在首地址在str中的内存块中char str[] = " abcdefgdddd ", 同理char p1[20], 将两者作为实参传进函数TrimSpaceStr(str, p1);
注意点: 若在主函数中定义的是char *p = " abcdefgdddd ",则在函数中不可以修改*p,字符串在常量区
总结:
1. 字符串可以在栈区str[]="",堆区char *p = malloc,还有常量区分配内存char *p = "",千万小心!!
2. 不要轻易的修改从别的地方传过来的内存块的内容,真的要修改也要新的自己开辟一块内存!
标签:
原文地址:http://www.cnblogs.com/gossiplee/p/4478586.html