C/C++笔记之字符串
gets() 函数
该函数的原型为:
# include <stdio.h>
char *gets(char *str);
这个函数很简单,只有一个参数。参数类型为
char* 型,即 str 可以是一个字符指针变量名,也可以是一个字符数组名。
gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。
下面将前面中使用 scanf 输入字符串的程序改一下:
- # include <stdio.h>
- int main(void)
- {
- char str[20] = "\0"; //字符数组初始化\0
- printf("请输入字符串:");
- gets(str);
- printf("%s\n", str);
- return 0;
- }
输出结果是:
请输入字符串:i love you
i love you
可见,gets() 函数不仅比 scanf 简洁,而且,就算输入的字符串中有空格也可以直接输入,不用像 scanf 那样要定义多个字符数组。也就是说:
- gets(str);
完全可以取代:
- scanf("%s", string);
不仅代码更简洁,而且可以直接输入带空格的字符串。同样,前面章节中,对字符指针变量所指向的内存单元进行初始化也可以用 gets(),下面将那个程序也改一下,将 scanf 换成 gets():
- # include <stdio.h>
- int main(void)
- {
- char str[30];
- char *string = str; //一定要先将指针变量初始化
- printf("请输入字符串:");
- gets(string); //也可以写成gets(str);
- printf("%s\n", string); //输出参数是已经定义好的“指针变量名”
- return 0;
10. }
输出结果是:
请输入字符串:Hi i...like you
Hi i...like you
此外,关于使用 gets() 函数需要注意:使用 gets()
时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。下面写一个程序验证一下:
- # include <stdio.h>
- int main(void)
- {
- char str[30];
- char ch;
- printf("请输入字符串:");
- gets(str);
- printf("%s\n", str);
- scanf("%c", &ch);
- 10. printf("ch = %c\n", ch);
- 11. return 0;
12. }
输出结果是:
请输入字符串:i love you
i love you
Y
ch = Y
我们看到,没有清空缓冲区照样可以输入'Y',因为 gets()
已经将缓冲区中的回车取出来丢掉了。如果前面使用的不是 gets() 而是 scanf,那么通过键盘给 ch 赋值前就必须先使用 getchar() 清空缓冲区。
puts() 函数
该函数的原型为:
# include <stdio.h>
int puts(const char *s);
这个函数也很简单,只有一个参数。s可以是字符指针变量名、字符数组名,或者直接是一个字符串常量。功能是将字符串输出到屏幕。输出时只有遇到 '\0' 也就是字符串结束标志符才会停止。
下面写一个程序:
- # include <stdio.h>
- int main(void)
- {
- char name[] = "祖国!";
- printf("%s\n", name); //用printf输出
- puts(name); //用puts()输出
- puts("我爱你!"); //直接输出字符串
- return 0;
- }
输出结果是:
祖国!祖国!我爱你!
可见使用 puts() 输出更简洁、更方便。而且使用
puts() 函数连换行符 '\n' 都省了,使用
puts() 显示字符串时,系统会自动在其后添加一个换行符,也就是说:
- printf("%s\n", name);
和:
- puts(name);
是等价的。所以前面字符指针变量中:
- printf("%s\n", string);
也可以直接写成:
- puts(string);
我们写一个程序来验证一下:
- # include <stdio.h>
- int main(void)
- {
- char *string = "I Love You China!";
- puts(string);
- return 0;
- }
输出结果是:
I Love You China!
但是 puts() 和 printf() 相比也有一个小小的缺陷,就是如果 puts() 后面的参数是字符指针变量或字符数组,那么括号中除了字符指针变量名或字符数组名之外什么都不能写。比如 printf() 可以这样写:
- printf("输出结果是:%s\n", str);
而 puts() 就不能使用如下写法:
- puts(输出结果是:str);
因此,puts() 虽然简单、方便,但也仅限于输出字符串,功能还是没有 printf() 强大。
getch():
所在头文件:conio.h
函数用途:从控制台读取一个字符,但不显示在屏幕上
函数原型:int getch(void)
返回值:读取的字符
例如:
char ch;或int ch;
getch();或ch=getch();
用getch();会等待你按下任意键,再继续执行下面的语句;
用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。
1.所在头文件是conio.h。而不是stdio.h。
2.在使用之前要调用initscr(),结束时要调用endwin()。否则会出现不输入字符这个函数
也会返回的情况。
3.在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n)
1)windows平台下ENTER键会产生两个转义字符 \r\n,因此getch返回13(\r)。
2)unix、 linux系统中ENTER键只产生 \n ,因此getch返回10(\n)。
3)MAC OS中ENTER键将产生 \r ,因此getch返回13(\r)。