C语言 数据类型输入输出函数(2018.11.17)

本文深入探讨C语言的基本数据类型、格式化输入输出、变量初始化、存储类别、const与volatile关键字、结构体与共用体等核心概念,同时解析内存分配、数据对齐和字节序等高级主题。

基本数据类型
5个方式了解基本类型
1、符号
2、字节数
3、数据范围
4、表示方法
5、运算方法

内存空间分配给变量,不是类型
指针类型:指针变脸中只能存放地址
空类型:主要用于数据类型的转换和定义函数类型
void指针是万用指针,万用=无用,多数用于类型转换后使用

限定性流程转向,调用、返回函数。函数只能返回一个值。输入输出参数能使函数返回多于一个值。

‘/0’与NULL的值都等于0

typedef 重新制定声明变量类型

printf()
由头文件 stdio.h 声明。
std 标准库
i 输入
o 输出

格式控制符

1、%d。按10进制整型数据的实际长度输出。
2、%md。如果数据的位数小于m,则左端补以空格,若大于吗,则按实际位数输出。
3、%ld。输出长整型数据。
4、%o。以八进制整数形式输出。
5、%c。输出一个字符
6、%s。输出字符串
%ms:输出的字符串占m列。若字符串小于m,向左补空格。大于m,全部输出。
%-ms:如果字符串小于m,则右补空格。
%m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格
%-m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,右补空格
7、%m.nf:指定输出的数据占m列,其中有n位小数。如果数值长度小于m,则左端补空格
8、%x,%X:十六进制无符号整型 【%x:ff,%X:FF】
9、%e,%E 指数形式浮点小数。【%e:5.67e+02,%E:5.67E+02】
10、%-:输出数据在域内左对齐。
11、%+:指定在有符号类型的正数前有正号“+”
12、%#:在八、十六进制数显示0,0x。
13、%0:输出数值是指定左边不使用的空位补0。

scanf()
键盘输入 ------->缓冲区 -------> scanf在缓冲区取数值
scanf输入会产生输入垃圾
用getchar()取一个字符,可以取走输入垃圾‘/n’或者‘空格’
fflush:清空输入缓冲区

格式控制符
%k:短整型
%m:指定输入数据所占宽度【不能针对精度】
%*:赋值抑制符【消除输入垃圾】【文件操作用得比较多】
eg:
scanf(%d%*d%d,&a,&b);

scanf不能输入带空格的字符串
gets,只认回车为结束符号,可以输入带空格的字符串。

一般变量初始化:
默认初始化:1、全局变量,静态变量【存放全局/静态区,值为0,若是字符串,为空】
2、局部变量【动态数据区,值为随机值】
人工初始化:
1、数值变量
2、字符变量
3、指针变量【当指针变量不确定时,*p = NULL【防止野指针】】
4、数组

auto【默认】动态变量
static 静态变量
register 外部变量
extern 声明变量

static+全局变量:只能当前文件可以使用【防止文件与文件里同名的函数定义错误】
局部静态变量:存在不可见,仅限在本函数里用,多数用于保留上次调用函数时计算的值
全局变量:全部可以使用
register【寄存器变量】:1、只能是基本类型int
2、不能取地址
3、不能定义成静态变量
eg
10个寄存器,定义了15个,有5个还是在内存中

const 只读变量
const int *a;int const *a;
一个指向const int 型的指针
*a不可以修改
a可以改写

int *const a;【a需要初始化】
a是指向int 的const指针,*a可以改写,a不可以

int const *const a
都不可以改写

volatile【多用于arm】
限制优化,不可以被优化

结构体

struct node
{
    char a;
    short b;
    char c;
    struct node *p;【这里的结构体指针变量只能指向自己】
}std;

引用形式:结构体变量名.成员名
或者 p = &std;p -> a; (*p).a

内存空洞
字对齐、半字对齐。

struct node
{char ch;
 int num;
}; 变量占8个字节//字对齐 4+4 =8

struct node
{char ch;
 short num;
 char ch1;
  short b; 
}; 变量占8个字节 //半字对齐,2+2+2+2 = 8

struct node
{char ch;
  char ch1;
  char ch2
}; 变量占3个字节

struct node
{char ch;    // 4
 int num;   //4
 char ch1;  //ch1+ch2=4
 char ch2;  
 double c;    //8
 char ch3;  //ch3 +short =4
 short b; 
}; 变量占24个字节 //4*4+8=24

共用体union
可以把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中。即使几个不同的变量共占同一段内存空间。

union node
{ char ch[7];
  int num;
};      占8字节!//分配空间字对齐!4的整数倍

大端字节序:数据高位写在低位内存地址
小段字节序:数据低位写在高位内存地址

枚举类型
枚举类型声明代表常量的符号名称。
enum的默认值
enum kids{nippy, slats, skippy, nina ,liz};
enum的指定值
enum levels {low=100,medium=500,high=2000};

define 宏定义
定义常量与命令(避免幻数)
#define

<think>我们被要求回答关于C语言stdio.h标准库函数列表的问题。根据引用内容,我们知道stdio.h中定义了一些变量类型(如size_t,FILE,fpos_t)和宏(如stdin,stdout,stderr)。同时,引用中提到了两个函数:fread和fwrite。但是,用户要求的是函数列表,因此我们需要提供stdio.h中常见的函数列表。注意:由于引用内容有限,我们只能根据引用提到的内容以及常见的stdio函数来回答。常见的stdio.h函数包括:文件操作:fopen,fclose,fflush文件定位:fseek,ftell,rewind字符输入输出:fgetc,getc,getchar,fputc,putc,putchar字符串输入输出:fgets,gets(注意:gets已废弃),fputs,puts格式化输入输出:scanf,fscanf,sscanf,printf,fprintf,sprintf直接输入输出:fread,fwrite错误处理:perror文件删除和重命名:remove,rename临时文件:tmpfile,tmpnam但是,由于引用中只提到了fread和fwrite,并且提到了stdin,stdout,stderr,我们可以结合这些引用进行回答。我们还可以参考引用[1]中提到的stdin,stdout,stderr,引用[2]中提到的变量类型,引用[3]中提到的fwrite。因此,我们可以这样组织回答:首先介绍stdio.h是什么,然后列出一些主要的函数,并简要说明其功能。注意:由于引用内容有限,我们不会列出所有函数,但会列出常见且重要的函数。另外,根据引用[1]和[2],我们可以提到:-stdin,stdout,stderr是已经定义好的标准流。-文件操作需要使用FILE类型。由于用户要求的是函数列表,我们将按类别列出函数。注意:在回答中,我们不需要写出所有函数的详细描述,但可以给出代表性函数的简要说明,并提到一些重要函数。根据引用[1][2][3],我们特别提到fread和fwrite。回答结构:1.简要介绍stdio.h2.列出函数列表(按功能分组)3.说明这些函数通常与预定义的标准流(stdin,stdout,stderr)或自定义的FILE指针一起使用。注意:由于引用中提到了fread和fwrite,我们可以将这两个函数放在“直接输入输出”或“文件读写”类别中。由于引用[1]中提到了fread,引用[3]中提到了fwrite,我们可以在回答中引用这些内容。但是,用户的问题只是要求函数列表,因此我们不需要详细解释每个函数,但可以给出一些例子。根据系统指令,我们需要在行内数学表达式使用$...$,但这个问题中可能没有数学表达式,所以可以忽略。独立公式也没有必要,所以忽略。另外,需要生成相关问题。最后,在回答中引用的段落末尾添加引用标识。开始回答:</think>### C语言 `stdio.h` 标准库函数列表 `stdio.h`(标准输入输出头文件)是C语言中处理输入输出的核心库,定义了文件操作、流控制和格式化I/O相关函数。以下按功能分类列出主要函数(基于C11标准): --- #### **文件操作函数** 1. **`fopen()`** 打开文件,返回`FILE`指针。 示例:`FILE *fp = fopen("file.txt", "r");` 2. **`fclose()`** 关闭文件流。 示例:`fclose(fp);` 3. **`freopen()`** 重定向流到新文件。 示例:`freopen("log.txt", "w", stdout);` [^1] 4. **`remove()`** 删除文件。 示例:`remove("temp.txt");` 5. **`rename()`** 重命名文件。 示例:`rename("old.txt", "new.txt");` --- #### **数据读写函数** 6. **`fgetc()` / `getc()`** 从流中读取单个字符。 区别:`getc()`可能是宏实现。 7. **`fputc()` / `putc()`** 向流写入单个字符。 8. **`fgets()`** 读取字符串(含换行符)。 示例:`fgets(buffer, 100, stdin);` [^1] 9. **`fputs()`** 写入字符串(不含换行符)。 10. **`fread()`** 从流读取二进制数据。 函数原型: ```c size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); ``` 示例:`fread(arr, sizeof(int), 5, fp);` [^1] 11. **`fwrite()`** 向流写入二进制数据。 函数原型: ```c size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); ``` 示例:`fwrite(data, 1, len, stdout);` [^3] --- #### **格式化I/O函数** 12. **`printf()` / `fprintf()` / `sprintf()`** 格式化输出到`stdout`/文件/字符串。 示例:`fprintf(stderr, "Error: %d\n", errno);` [^1] 13. **`scanf()` / `fscanf()` / `sscanf()`** 格式化输入从`stdin`/文件/字符串。 --- #### **流控制函数** 14. **`fflush()`** 刷新流缓冲区。 示例:`fflush(stdout);` 15. **`fseek()` / `ftell()`** 设置/获取文件位置。 示例:`fseek(fp, 0, SEEK_END);` 16. **`rewind()`** 重置文件位置到开头。 17. **`feof()` / `ferror()`** 检测文件结束或错误标志。 --- #### **标准流操作** 18. **`getchar()` / `putchar()`** 等价于`getc(stdin)` / `putc(char, stdout)`。 19. **`puts()`** 写入字符串并自动添加换行符。 示例:`puts("Hello");` --- #### **辅助功能** 20. **`tmpfile()`** 创建临时文件(自动删除)。 21. **`tmpnam()`** 生成唯一临时文件名。 22. **`perror()`** 打印错误描述。 示例:`perror("fopen failed");` --- #### **关键类型与宏** - **`FILE`**:文件流对象类型 [^2] - **`size_t`**:无符号整数类型(`sizeof`的结果)[^2] - **`stdin`**, **`stdout`**, **`stderr`**:标准输入/输出/错误流(系统预定义)[^1] > 完整列表详见C标准文档(如ISO/IEC 9899:2018)。实际开发中可通过`man stdio`(Linux)或查阅编译器手册获取细节。 --- ### 相关问题 1. `fread()` 和 `fwrite()` 在处理二进制数据时有哪些注意事项? 2. 如何用 `stdio.h` 函数实现文件复制操作? 3. 为什么 `gets()` 函数被标记为不安全?它的替代方案是什么? 4. `printf()` 的格式化字符串中 `%d`、`%p`、`%zu` 分别代表什么? 5. 缓冲区刷新(`fflush()`)在什么场景下必须显式调用?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值