【例8-13】用字符指针操作字符串

字符串实质上是存放在某存储区域的一串字符序列,所以可以用字符指针指向字符串,通过字符指针访问该存储区域。例如:char *cp = "a string"    cp被定义为字符指针,它指向字符串的首字符"a",通过cp[i]或*(cp+i)就可以访问到每一个字符

例题中出现的输入缓冲区问题:

输入缓冲区:所有从键盘输入的数据,不管是字符还是数字,都是先存储在内存的缓
                      冲区中,叫作“键盘输入缓冲区”,简称“输入缓冲区”或“输入流”。

从键盘输入的数据都会被依次存入缓冲区,不管是数字还是字符都会被当成数据存进去。
常用的输入函数有scanf_s()、getchar()。这两个函数都是按回车键才会进入缓冲区取出数据。
scanf_s():当该函数的格式控制符是"%d"时,按下回车键后,在缓冲区中,空格、回车、Tab 键
                  都只是分隔符,不会被"scanf_s("%d")当成数据取用,遇到它们就跳过,取下一个数据,
                  如果遇到字符(空格、回车、Tab 除外),则直接从输入流中退出来,什么都不取。
                  当该函数的格式控制符是"%c"时,那么任何数据都会被当作一个字符取用。
                  所取数据的个数取决于 scanf_s() 中“输入参数”的个数。

getchar():该函数是字符输入函数,一次从缓冲区中取出一个字符。

那么,问题来了,scanf_s()、getchar()每次进入缓冲区取数据时,按下的这个回车键会遗留在缓冲区内。在多个scanf_s("%d")函数调用时,第一个scanf_s遗留一个回车,第二个scanf_s跳过并释放第一个回车,但又遗留一个回车,以此类推,缓冲区内始终遗留有一个"\n",这时要用格式控制符"%c"实现输入某个字符时,就会发现被scanf_s("%c")第一个取出的是遗留的回车键"\n"。
多个getchar()或scanf_s("%c")函数调用也一样,因为上一个调用遗留下来的回车,下一getchar()取出的就是这个遗留的回车。

解决缓冲区遗留问题的方法有两个:
1.定义一个字符变量ch吸收掉多余的字符。
2.使用fflush(stdin)直接清空缓冲区    (VisualStdio使用了无报错也无作用)

参考资料:http://c.biancheng.net/view/183.html

//用字符串操作字符串的演示
将字符串中的指定字符用另一个字符替换

#include<stdio.h>
void replace(char*, char, char);
int main()
{
	char s[] = "My name is Jason";
	char ch, c1, c2;
	printf("原来的字符串为:%s\n", s);
	printf("请指定一个被替换字符:");
	c1 = getchar();
  //fflush(stdin);			//清空输入缓冲区函数,据说在VC6.0可用,此处没反应也没报错。
	ch = getchar();			//该语句作用是吸收上一个getchar()在缓冲区遗留的回车键字符'\n'
	printf("请输入一个新字符:");
	c2 = getchar();
	replace(s, c1, c2);
	printf("新的字符串为:%s\n", s);
 
	return 0;
}
void replace(char *p,char oldc,char newc)
{
	int i;
	for (i = 0; p[i] != '\0'; i++)
		if (p[i] == oldc)	p[i] = newc;
}

//使用fflush函数, 没有实现清空缓冲区效果

 //随堂练习8-4
自定义函数实现"计算一个字符串的实际长度"功能

#include<stdio.h>
int strlen(char* s)
{
	int len = 0;
	while (s[len] != '\0')
		len++;
	return (len);
}
int main(void)
{
	char s[100];
	int a;
    printf("请输入要计算长度的字符串:");
	gets_s(s, 100);
	a = strlen(s);
	printf("%d", a);

	return 0;
}

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值