字符串实质上是存放在某存储区域的一串字符序列,所以可以用字符指针指向字符串,通过字符指针访问该存储区域。例如: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;
}