格式化输出
%d,输出整数;
%5d,输出整数,宽度为5;
%-5d,输出整数,宽度为5,左对齐;
%f,输出浮点数;%.3f 保留三位小数;
%e,输出 科学计数法 浮点数;
%c,输出单个字符;将字符格式化%d,即转ASCII码;整数格式化为%c,获取对应的字符。
%s,输出字符串(字符指针);
%p,格式化为指针;
字符对应的ASCII码表
字符串的加密与解密
- 输入一个字符串,输出其加密结果,加密方法自定;
- 采用同样的算法,为你的加密结果,进行解密
#include <stdio.h>
#include <string.h>
char* encrypt(char* ptr) {
int i = 0;
char* head = ptr;
while (*ptr != 0) { // 当前字符不为'\0'(未结束)
*ptr = *ptr + i + 5;
++i;
++ptr;
}
return head;
}
// restore
char* restore(char* ptr) {
int i = 0;
char* head = ptr;
while (*ptr != 0) {
*ptr = *ptr - i - 5;
++i;
++ptr;
}
return head;
}
int main(int argc, char* argv[]) {
// 用户输入字符串,存入字符数组(足够大)
char arr[100]; // 数组首地址可以赋值给指针,但是指针地址不能赋值给数组变量;
scanf("%s", arr);
// 统计字符串的长度
int size = strlen(arr);
// 按照长度 分配内存
char* result = (char*)malloc(size * sizeof(char));
// 内存初始化
memset(result, '\0', size);
// 加密并获取结果
result = encrypt(arr);
printf("加密结果:%s\n", result);
// 恢复
printf("恢复的结果:%s\n", restore(result));
return 0;
}
结构体与文件
- 定义一个学生结构体
- 姓名
- 年龄
- 学号
- 成绩
- 生成三个学生的数组;
- 将数组中的学生,写入stu.txt文件中;
#include <stdio.h>
#include <string.h> // 字符串操作的头文件
#include <malloc.h> // 动态分配内存的头文件
// 声明结构体类型,不分配内存
struct Stu {
char name[20]; // 字符数组表示字符串,不用字符指针
int age;
double score;
int num;
}; // 结构体 必须有分号 也可以同时定义 结构体 变量
int main(int argc, char* argv[]) {
// 定义结构体数组
struct Stu arr[3]; // 分配内存
char* names[3] = { "jack", "lucy", "tom" };
int ages[] = { 18, 20, 23 };
double scores[] = { 87.5, 76.0, 93.5 };
int nums[] = { 1,2,3 };
int size = 3;
for (int i = 0; i < size; i++) {
struct Stu stu; // 定义变量同时,可以初始化
strcpy(stu.name, names[i]); // 字符串 后续的赋值,只能拷贝
stu.age = ages[i];
stu.num = nums[i];
stu.score = scores[i];
arr[i] = stu;
}
// 结构体 写入文件
FILE* fp = NULL;
fp = fopen("stu.txt", "ab");
// 基于 二进制的 内存块的读写
for (int i = 0; i < size; i++) {
// 写入
fwrite(&arr[i], sizeof(struct Stu), 1, fp); // 将结构体数组 写入fp 1次;
}
// 关闭文件
fclose(fp);
return 0;
}
- 读取文件,并打印学生信息;
#include <stdio.h>
#include <string.h> // 字符串操作的头文件
#include <malloc.h> // 动态分配内存的头文件
// 声明结构体类型,不分配内存
struct Stu {
char name[20]; // 字符数组表示字符串,不用字符指针
int age;
double score;
int num;
}; // 结构体 必须有分号 也可以同时定义 结构体 变量
int main(int argc, char* argv[]) {
FILE* fp;
fp = fopen("stu.txt", "rb");
while (!feof(fp)) { // feof(fp) 是否到文件末尾
// 读取一个结构体
struct Stu stu;
fread(&stu, sizeof(struct Stu), 1, fp);
printf("学生姓名:%s\n", stu.name);
printf("学生学号:%d\n", stu.num);
printf("学生年龄:%d\n", stu.age);
printf("学生成绩:%.1e\n", stu.score); // 科学计数法
}
// 关闭文件
fclose(fp);
return 0;
}
函数与二维数组
- 函数传参二维数组
- void func(int arr[][3], int row, int col){ } ;必须指定列数
- void func(int (*ptr)[3]){ }; 整型数组的指针;
- void func(int **ptr){ }; 整型指针的指针;
#include <stdio.h>
#include <string.h> // 字符串操作的头文件
#include <malloc.h> // 动态分配内存的头文件
#define ROW 2 // 宏常量,编译时做文本替换
#define COL 3
// 传参二维数组
void func(int arr[][3], int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("arr[%d][%d]:%d\n", i, j, arr[i][j]);
}
}
}
// 传参 整型指针 的数组
void func2(int(*ptr)[3], int row, int col) { //
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("arr[%d][%d]:%d\n", i, j, *(*(ptr+i)+j));
}
}
}
int main(int argc, char* argv[]) {
int arr[ROW][COL] = { 1,2,3, 1,0,1 };
// 传参二维数组
func(arr, ROW, COL);
printf("\n");
func2(arr, ROW, COL);
return 0;
}