指针应用基础练习

(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;
}

执行结果如下 

扫描二维码关注公众号,回复: 16009913 查看本文章

(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
解析 目标空间地址 要拷贝内容空间源地址 拷贝内容字节数

猜你喜欢

转载自blog.csdn.net/weixin_69884785/article/details/131948619