(1)一级指针,二级指针
void getString(char **p) { *p = "hello world"; } int main(void) { char *str = NULL; getString(&str); printf("%s\n", str); }
代码分析:
定义了一个char型指针str,开始的时候指向NULL,即str此时的值为0。 然后将 str 的地址传递给函数 getString(),而**p就是*p的地址,那么str的地址=*p的地址,所以
*p = "hello world"; 等价于: str = "hello world";
(2)指针在字符串函数中的应用(strok)
对于这个函数需注意
1.该函数会改变原始字符串 str,使其所包含的所有分隔符变成结束标记 ‘\0’ 。
2.由于该函数需要更改字符串 str,因此 str 指向的内存必须是可写的。
3.首次调用时 str 指向原始字符串,此后每次调用 str 用 NULL 代替。
如果想详细了解strtok:http://t.csdn.cn/mwDpI
#include<stdio.h> #include<string.h> int main() { char str[80]="aaa-bbb-ccc"; const char stop[2]="-"; char *s; s=strtok(str,stop); while(s!=NULL) { printf("%s ",s); s=strtok(NULL,stop); } return 0; }
执行结果如下
(3)编写一个程序,将两个给定的字符串连接起来,要求不能用 strcat 或 strncat 函数。
注意:要考虑字符串拼接后存储空间是否足够,是否发生内存溢出的情况
代码如下
#include <stdio.h> #include <string.h> char *strcat(char *str1, char *str2) { int i; i = strlen(str1); int j; for(j=0; j<50-i; j++)//不能越界 { str1[j+i] = str2[j]; } return str1; } int main(void) { char str1[50] = "hello"; char str2[50] = "csdn"; printf("合并后: %s\n", strcat(str1, str2)); return 0; }
(4)编写一个函数,接收一个给定的字符串,返回去除所有的空格后的字符串
代码如下
#include <stdio.h> #include <stdlib.h> char * trim(char *s) { if(s == NULL) return s; int size = strlen(s) + 1; char tmp[size]; for(int i=0, j=0; i<=size; i++) { if(s[i]!=' ') { tmp[j] = s[i]; j++; } } memcpy(s, tmp, size);//将临时数组的数据复制回原始字符串数组 return s; } int main() { char s[100]; bzero(s, 100);//保证数组中的数据在使用前被置0 fgets(s, 100, stdin);//从标准输入stdin中,读取最多100个字符,并将其存储到s数组,fgets函数在读取完字符后会自动停止,或者在遇到换行符后自动停止 printf("%s\n", trim(s)); return 0; }
对于memcpy:不像strncpy函数一样只能拷贝字符,memcpy函数可以拷贝任意类型的内容
参数 dest src count
解析 目标空间地址 要拷贝内容空间源地址 拷贝内容字节数