C语言初学之fscanf()函数理解
2016-02-01 16:41
363 查看
本人第一次写博客,所以不足之处希望大家多多指出,万分感谢。
这里主要想通过写博客巩固自己的知识,并且能够检验自己所学的是否正确,还能够不断加入新的知识,并且不断与高手交流,提高自己。
好了多的不说了。
下面主要对自己关于fscanf()函数的体会:
(1)自己有一段数据,
数据如下
19940329,2009040112,90
19940503,2009040117,96
10040508,2009040114,86
等等
第一列表示生日,第二列表示学号,第三列表示分数,中间通过逗号隔开,自己想通过fscanf函数达到如下输出
生日:19940329,学号:2009040112,考试分数:90
代码如下
fscanf(“%s%s%i”,birthday,number,&score)
测试时即使我输入的字符个数多余3个,也会照样输出,我记得c语言里面的字符数组最后面以\0,也就是NULL来作为结束的标志,所以我这里char name[4]最多应该输入三个字符,我觉得程序没有检查这个问题(当然这里我的认识可能错误),所以比较危险。但是我改成
fscanf(stdin,”%2s”,name)之后也没有作用,这里求教
还有源程序中[^,]表示的是遇到逗号就作为结束。
下面用重定向的方式从文件读取,再写入新的文件中去:
源文件数据:
19940904,201204015001,90
19940329,201204015002,95
19950302,201204015003,92
19940613,201204015004,84
19951221,201204015005,83
19940204,201204015006,97
19940403,201204015007,76
19951131,201204015008,88
程序:
结果:
生日:19940904, 学号: 201204015001, 分数: 90
生日:
19940329, 学号: 201204015002, 分数: 95
生日:
19950302, 学号: 201204015003, 分数: 92
生日:
19940613, 学号: 201204015004, 分数: 84
生日:
19951221, 学号: 201204015005, 分数: 83
生日:
19940204, 学号: 201204015006, 分数: 97
(有一个问题,从第二项开始不知道问什么生日后面输出多了个换行,,,)
当然,程序还是很不完整,后面我还好继续改,也请大家帮忙看一下,批评指正。
这里主要想通过写博客巩固自己的知识,并且能够检验自己所学的是否正确,还能够不断加入新的知识,并且不断与高手交流,提高自己。
好了多的不说了。
下面主要对自己关于fscanf()函数的体会:
(1)自己有一段数据,
数据如下
19940329,2009040112,90
19940503,2009040117,96
10040508,2009040114,86
等等
第一列表示生日,第二列表示学号,第三列表示分数,中间通过逗号隔开,自己想通过fscanf函数达到如下输出
生日:19940329,学号:2009040112,考试分数:90
代码如下
[code] #include<stdio.h> int main() { char birthday[20] char number[20]; int score; puts("please input the birthday number and score in order ") while(fscanf(stdin,"%[^,],[^,],%i",birthday,number,&score)==3) { fprintf(stdout,"%s,%s,%i\n",birthday,number,score); } put("thanks for your visiting"); return 0; } 这个程序是简单将标准输入和标准输出默认为屏幕,只是作为检验程序是否正确输出,应该重定向到文件之中,在次之前,我想谈谈自己写上面代码遇到的问题。 首先如果初始数据之间不是以逗号隔开的,而是以空格分开,那么在写fscanf()时如下:
fscanf(“%s%s%i”,birthday,number,&score)
[code]后来我查fscanf的函数原型: int fscanf(FILE*stream,constchar*format,[argument...]); 其中的参数:const char * format 我举几个例子如下: %s : 读入一个字符串,遇空字符‘\0'结束。 我写了如下代码来检测: #include<stdio.h> int main() { char name[4]; fscanf(stdin,"%s",name); fprintf(stout,"%s\n",name); return 0; }
测试时即使我输入的字符个数多余3个,也会照样输出,我记得c语言里面的字符数组最后面以\0,也就是NULL来作为结束的标志,所以我这里char name[4]最多应该输入三个字符,我觉得程序没有检查这个问题(当然这里我的认识可能错误),所以比较危险。但是我改成
fscanf(stdin,”%2s”,name)之后也没有作用,这里求教
还有源程序中[^,]表示的是遇到逗号就作为结束。
下面用重定向的方式从文件读取,再写入新的文件中去:
源文件数据:
19940904,201204015001,90
19940329,201204015002,95
19950302,201204015003,92
19940613,201204015004,84
19951221,201204015005,83
19940204,201204015006,97
19940403,201204015007,76
19951131,201204015008,88
程序:
[code]#include<stdio.h> int main() { char birthday[20]; char number[20]; int score; FILE *infile=fopen("primitive_data.txt","r"); FILE *outfile=fopen("organized_data.txt","w"); while(fscanf(infile,"%[^,],%[^,],%i",birthday,number,&score)==3) { fprintf(outfile,"生日:%s, 学号: %s, 分数: %i\n",birthday,number,score); } return 0; }
结果:
生日:19940904, 学号: 201204015001, 分数: 90
生日:
19940329, 学号: 201204015002, 分数: 95
生日:
19950302, 学号: 201204015003, 分数: 92
生日:
19940613, 学号: 201204015004, 分数: 84
生日:
19951221, 学号: 201204015005, 分数: 83
生日:
19940204, 学号: 201204015006, 分数: 97
(有一个问题,从第二项开始不知道问什么生日后面输出多了个换行,,,)
当然,程序还是很不完整,后面我还好继续改,也请大家帮忙看一下,批评指正。
相关文章推荐
- 字符串HASH模板
- 如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
- 《API Design for C++》读书笔记(一):API 简介
- C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)
- 逐梦C++之三:文件输入与输出
- Windows编程C++之句柄
- Protocol Buffer技术详解(C++实例)
- 使用eclipse for c++的一个报错问题
- C/C++ sort函数的用法
- 平衡二叉树(AVL树)的创建,查找
- 生活中的数学问题(二)
- c++特性:static_assert
- VC++6.0注释快捷键的添加使用
- 对于c语言窗口怎么换不同颜色问题详解 用SetConsoleTextAttribute
- 【笔试常考】C语言:深度剖析strlen,sizeof
- c语言---数据和程序
- 使用C与C++混合编程封装UDP协议
- Windows编程数据类型概述 C++
- leetcode刷题系列C++-Search in Rotated Sorted Array II
- 生活中的数学问题(一)