1. 字符串输入(gets、fgets、gets_s、scanf)
a. 分配内存空间
a. 静态内存分配
○ 指的是在编译时确定数组等数据类型的大小,然后由计算机分配好
○ 在声明数组时要显式的声明数组的大小,为字符串的输入分配内存空间
○ char name[81];
b. 动态内存分配
○ 通俗一点就是向计算机要内存空间,是在程序运行时,再向计算机要内存
○ 一般是用malloc函数
§ #include<stdlib.h>
§ void* malloc(size_t size);
§ 利用malloc申请到的内存空间是以字节为单位的,返回的结果是void *,一般需要类型转换为自己需要的类型号
int *a;
a=(int*)malloc(n*sizeof(int)); //本语句的意思就是通过malloc函数向计算机申请一块内存空间,这个空间的大小是
n*sizeof(int),返回的是一个void*类型的指针,也就是一个指向未知类型数据的地址,之后再把这个指针转化为我们需要的类型---int *。
§ 与申请内存空间相对应的就是释放内存空间free()
□ free(a);
□ 只能还申请来的空间的首地址
§ 如果申请失败了就会选择返回0或者是NULL
b. gets()
○ gets()函数只是知道分配的内存空间的地址,但是不知道分配的内存空间有多大,也即是有可能会造成缓存区溢出问题
○ 读取整行数据,直至遇到换行符
○ gets函数会将读进的换行符丢掉
c. fgets()函数(通常是最佳选择)
○ fgets(缓冲区地址,读入字符最大值,提供字符串的文件)
○ fgets知道要分配的内存地址和内存空间的最大值,以及字符串数据的来源(文件),如果在控制台读入,则用stdin。
○ fgets()将读入n-1字符或者遇到第一个换行符为止
○ fgets把换行符放在字符串末尾
○ 该函数函数返回的地址与传入的第 1 个参数相同
#include <stdio.h>
#define SIZE 10
int main ( )
{
char words[ SIZE] ;
puts ( "Enter string:" ) ;
while ( fgets ( words, SIZE, stdin ) != NULL && words[ 0 ] != '\n' )
{
fputs ( words, stdout ) ;
}
puts ( "Done" ) ;
return 0 ;
}
○ fputs(数据来源,要写入的文件)
○ fputs知道数据来源和数据要写入到哪个文件,如果是写入到控制台,则用stdout
○ 数据来源有什么就会写什么,不会自动添加换行符
d. gets_s()函数也可以用于替代gets
○ gets_s(argu1,argu2)
§ argu1是存储位置,argu2是最大字符数
○ 和gets()一样,读到换行符时,会把换行符丢弃掉
e. scanf()
○ scanf函数确定字符串末尾的方法是
○ 从非空白开始直至遇到第一个空白字符(包括空行、空格、制表符、换行符)
○ 若指定字段宽,则将满足字宽和第一个空白字符“做或逻辑”--->满足即可
○ 若上一次读取键盘输入没有读完,下一次读取会从上次调用函数结束的地方开始
2. 字符串输出:puts()、fputs()、printf()
a. puts(argu1)函数
a. argu1:输出字符串的地址
b. puts函数会在输出字符串的末尾自动加上换行符
c. 遇到空字符就会停止输出---因此必须确保要有空字符
d. 如果没有空字符,那么puts会继续打印内存中后面的字符直至遇到空字符
b. fputs(argu1,argu2)函数
a. argu1:输出字符地址;argu2:要写入数据的文件(打印在显示器用stdout)
b. 不在末尾添加换行符号
c. printf()函数
a. 不在末尾加换行符号
b. 打印多个字符串更加简单
3. 自定义输入输出函数
a. 利用putchar,getchar,while循环等自定义输入输出函数