配套代码笔记Github地址 。
目录
第三章 输入输出专题 input & output -> I/O(标准IO,文件IO)
内容
格式化输入输出函数:scanf
, printf
字符输入输出函数:getchar
, putchar
字符串输入输出函数:gets(!)
,puts
格式化输入输出函数
printf
1 2 int printf (const char *format, ...) ; format: "%【修饰符】格式字符" ,参照图片标准输出修饰符和格式字符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 int main () { FILE *fp; long a = 11 ; fp = fopen(); func(fp, a); func(fp, 12 ); func(fp, 12L ); func(fp, 12LL ); }
传输一个5G的文件
1 5LL *1204LL *1204LL *1204LL
定义一个宏,表示一年有多少秒
1 2 #define SEC_YEAR (60LL * 60LL * 24LL * 365LL)
强制刷新缓冲区,以死循环调试举例。
1 2 3 4 5 6 7 8 printf ("[%s:%d]before while().\n" , __FUNCTION__, __LINE__);while (1 ) { }printf ("[%s:%d]after while().\n" , __FUNCTION__, __LINE__);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 #include <stdio.h> #include <stdlib.h> #define STRSIZE 10 int main () { int i = 255 ; float f = 123.45678 ; char str[STRSIZE] = "helloworld" ; double dou = 123.456 ; long long l = 123456 ; printf ("[%s:%d]before while().\n" , __FUNCTION__, __LINE__); while (1 ) { } printf ("[%s:%d]after while().\n" , __FUNCTION__, __LINE__); exit (0 ); }#if 0 func(FILE *fp, long i) { }int main () { FILE *fp; long a = 11 ; fp = fopen(); func(fp, a); func(fp, 12 ); func(fp, 12L ); func(fp, 12LL ); }#endif #define SEC_YEAR (60LL * 60LL * 24LL * 365LL)
scanf
1 2 3 4 int scanf (const char *format, 地址表) ; format:抑制符* %s非常危险,因为不知道储存空间的大小 放在循环结构中时要注意能否接收到正常内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 #include <stdio.h> #include <stdlib.h> #define STRSIZE 3 int main () { int i; float f; char str[STRSIZE]; int ret; char ch; printf ("Please enter:\n" ); printf ("i = %d, ch = %c\n" , i, ch);#if 0 while (1 ) { ret = scanf ("%d" , &i); if (ret != 1 ) { printf ("Enter Error!\n" ); break ; } printf ("i = %d\n" , i); }#endif exit (0 ); }
字符输入输出函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 int getchar (void ) ;int putchar (int c) ; #include <stdio.h> #include <stdlib.h> int main () { int ch; ch = getchar(); putchar (ch); exit (0 ); }
字符串输入输出函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 char *gets (char *s) ;int puts (const char *s) ;#include <stdio.h> #include <stdlib.h> #define STRSIZE 32 int main () { char str[STRSIZE]; gets(str); puts (str); exit (0 ); }
gets
非常危险,不会检查是否越界。使用的话用fgets
来代替。
1 char *fgets (char *s, int size, FILE *stream) ;
getline
是GNU libc
的方言,可以动态内存保证读取一整行。
练习专题 夸脱水
一个水分子3.0e-23g,一夸脱水约950g。
变成,输入水的夸脱数,输出其包含的水分子质量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 static void water (void ) { float num; float sum; printf ("Please input for num:" ); scanf ("%f" , &num); sum = num * KQ / WEIGHT; printf ("Total = %e\n" , sum); return ; }
三角形面积
输入三角形的三边长,求三角形面积。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 static void area (void ) { float a, b, c; float s, area; printf ("Please input:" ); scanf ("%f%f%f" , &a, &b, &c); if (a + b <= c || b + c <= a || a + c <= b) { fprintf (stderr , "EINVAL!\n" ); exit (0 ); } printf ("a = %f\n" , a); printf ("b = %f\n" , b); printf ("c = %f\n" , c); s = 1.0 / 2 * (a + b + c); printf ("s = %f\n" , s); area = sqrt (s * (s - a) * (s - b) * (s - c)); printf ("area = %f\n" , area); }
编译需要-lm
。makefile
如下,千万要注意makefile
要使用制表符 缩进,而非空格。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CC=cc CFLAGS= LDFLAGS=-lm TARGET=test SRC=test.c OBJ=$(SRC:.c=.o)$(TARGET) : $(OBJ) $(CC) -o $@ $^ $(LDFLAGS) %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(TARGET) $(OBJ)
求根公式
ax^2^ + bx + c = 0,假设b^2^ - 4ac >0
x1 = (-b + sqrt( b*b - 4ac )) / 2a
x2 = (-b - sqrt( b*b - 4ac )) / 2a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 void root (void ) { float a, b, c; float disc; float p, q; float x1, x2; printf ("Please input :\n" ); scanf ("%f%f%f" , &a, &b, &c); if (b * b - 4 * a * c < 0 ) { fprintf (stderr , "EINVAL\n" ); exit (1 ); } disc = b * b - 4 * a * c; p = -b / 2 * a; q = sqrt (disc) / 2 * a; x1 = p + q; x2 = p - q; printf ("x1 = %f\n" , x1); printf ("x2 = %f\n" , x2); }