1、按行将文本文件内容打印到屏幕
任务描述:
- 按行读取文本文件内容并输出到新的文件中
- 命令行中以文件名做输入参数
相关知识:
- FILE *fopen(const char *path, const char *mode):打开一个文件,返回指向FILE结构体的指针
- ssize_t getline(char **lineptr, size_t *n, FILE *stream):从文件流中读取一行字符串,并将字符串的地址存储到lineptr指向的指针中。返回的字符串以空字符’ ’结尾,同时包含换行符。参数n表示一次最多能读的字符数。
如果在调用getline之前,设置了*lineptr为NULL,*n被设置为0,那么getline将会分配一个缓冲区来存储读取的一行字符串。则会个缓冲区应当由用户程序进行释放。释放时通过调用free函数进行。
main.c:
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { FILE *fp; char *line=NULL; size_t len=0; ssize_t read; if(argc!=2){ perror("argc error "); exit(1); } fp=fopen(argv[1],"r"); if(fp==NULL){ perror("fopen error "); exit(EXIT_FAILURE); } while((read=getline(&line,&len,fp))!=-1) printf("%s",line); free(line); fclose(fp); return 0; }
2、字符串数组练习
任务描述:
- 使用二维数组创建字符串数组,把输入的多个字符串存储到字符串数组中,最后打印输出字符串数组
main.c:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define N 20 int main(void) { char str[N][N];int a,i; printf("please input your string number "); scanf("%d ",&a); for(i=0;i<a;i++) scanf("%s",str[i]); printf("your input string is "); for(i=0;i<a;i++) printf("%s ",str[i]); return 0; }
3、字符串数组
任务描述:
- 从键盘输入多个字符串,使用malloc函数创建字符串数组,把输入的多个字符串存储到字符串数组中,最后打印输出字符串数组
相关知识:
-
void *malloc(size_t size):分配了size个字节,并返回了指向这块内存的指针
-
指向指针的指针
如果一个指针变量的类型是“指向指针的指针”,那么这个指针变量对应的内存中存储的是一个指针值,这个指针值指向的内存中存储的也是一个指针。
比如:char ** lines = (char **)malloc(3*sizeof(char*)).那么在内存里面lines的表示为:
用malloc分配一个内存空间,包含3个指向字符的指针,返回一个指向内存空间首地址的指针lines,该指针类型就是指向指针的指针
-
void free(void *ptr):释放ptr指向的存储空间
被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及calloc函数来再分配。使用malloc分配的内存,需要自己调用free函数进行内存释放,否则,会造成内存泄漏的情况。
main.c:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define SIZE 20 int main(void) { char **strArray=NULL; char buf[SIZE]; int i,strNum; printf("please input number "); scanf("%d",&strNum); strArray=(char **)malloc(strNum*sizeof(char *)); for(i=0;i<strNum;i++){ strArray[i]=(char *)malloc(SIZE*sizeof(char)); memset(buf,'