(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函数可以拷贝任意类型的内容
http://t.csdn.cn/SHoJL
参数 | dest | src | count |
解析 | 目标空间地址 | 要拷贝内容空间源地址 | 拷贝内容字节数 |