(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);//保证数组中的数据在使用前被置0fgets(s, 100, stdin);//从标准输入stdin中,读取最多100个字符,并将其存储到s数组,fgets函数在读取完字符后会自动停止,或者在遇到换行符后自动停止printf("%s\n", trim(s));return 0;
}
对于memcpy:不像strncpy函数一样只能拷贝字符,memcpy函数可以拷贝任意类型的内容
http://t.csdn.cn/SHoJL
参数 | dest | src | count |
解析 | 目标空间地址 | 要拷贝内容空间源地址 | 拷贝内容字节数 |