输入输出库 <stdio.h> <string.h> <ctype.h>

7.1  标准输入输出
CH7-1 输入输出_职场#include <stdio.h>
CH7-1 输入输出_职场#include <stdlib.h>
CH7-1 输入输出_职场#include <ctype.h>
CH7-1 输入输出_职场//<和>表示在标准库位置寻找,UNIX下一般在/usr/include中
CH7-1 输入输出_职场//stdio.h中 int c = getchar(); putchar(c); printf(); EOF
CH7-1 输入输出_职场//ctype.h中 tolower(c); toupper(c);
CH7-1 输入输出_职场//stdlib.h中 EXIT_SUCCESS
CH7-1 输入输出_职场int main(int argc, char** argv) {
CH7-1 输入输出_职场                printf("Please input the 1st string end with Ctrl+D:\n");
CH7-1 输入输出_职场                int c;                                                        
CH7-1 输入输出_职场                while((c = getchar()) != EOF)        //EOF表示结束,Ctrl+D,//int getchar(void)
CH7-1 输入输出_职场                                putchar(tolower(c));  //tolower函数包含在ctype.h头文件中
CH7-1 输入输出_职场
CH7-1 输入输出_职场                printf("Please input the 2nd string end with Ctrl+D:\n");
CH7-1 输入输出_职场                int ch;
CH7-1 输入输出_职场                while((ch = getchar()) != EOF)
CH7-1 输入输出_职场                                putchar(toupper(ch)); //toupper函数包含在ctype.h头文件中
CH7-1 输入输出_职场
CH7-1 输入输出_职场                printf("EOF's value is: %d\n", EOF); //EOF定义在stdio.h中,值为-1
CH7-1 输入输出_职场                return (EXIT_SUCCESS);  //EXIT_SUCCESS 一般为0
CH7-1 输入输出_职场}

7.2  格式化输出 printf  sprintf
CH7-1 输入输出_职场#include <stdio.h>
CH7-1 输入输出_职场/* int printf(char *format, arg1, arg2, ...);  //返回打印字符个数
CH7-1 输入输出_职场 * %[-][width].[precision][conversion]
CH7-1 输入输出_职场 * %% 当打印%时,须%%         printf("Hello World! %%\n");
CH7-1 输入输出_职场 * - 表示左对齐,无表示右对齐
CH7-1 输入输出_职场 * width 至少宽度。若其值不够长,则左端或右端用空格补齐;若超过,则全部显示。
CH7-1 输入输出_职场                                printf("%2d\n", 123456); 结果为12345
CH7-1 输入输出_职场                                printf("%10d\n", 123456);结果为        123456
CH7-1 输入输出_职场 * precision        (1)若string类型,则最大打印的字符数,若不足,不补
CH7-1 输入输出_职场                                        printf("%.2s\n", "123456789");结果为12
CH7-1 输入输出_职场                                (2)若浮点型,则小数点后的精度(缺省为6),若不足用0补齐
CH7-1 输入输出_职场                                        printf("%.2f\n", 123.456); 结果为123.45
CH7-1 输入输出_职场                                        printf("%.5f\n", 123.456); 结果为123.4500
CH7-1 输入输出_职场                                (3)若是整型,为最小显示长度
CH7-1 输入输出_职场                                        printf("%.2d\n", 1);    结果为01
CH7-1 输入输出_职场 */

CH7-1 输入输出_职场int main(int argc, char** argv) {
CH7-1 输入输出_职场        printf("%d\n", -123);     //-123
CH7-1 输入输出_职场        printf("%o\n", 123);        //173
CH7-1 输入输出_职场        printf("%x\n", 123);        //7b
CH7-1 输入输出_职场        printf("%u\n", 123);        //123
CH7-1 输入输出_职场        
CH7-1 输入输出_职场        printf("%c\n", 123);        //{
CH7-1 输入输出_职场        
CH7-1 输入输出_职场        printf("%s\n", "123");     //123
CH7-1 输入输出_职场
CH7-1 输入输出_职场        printf("%f\n", 123.456); //123.456000 (缺省为6)
CH7-1 输入输出_职场        printf("%e\n", 123.456); //1.234560E+02(缺省为6)
CH7-1 输入输出_职场        printf("%g\n", 123.456); //123.456
CH7-1 输入输出_职场        return 0;
CH7-1 输入输出_职场}
 
CH7-1 输入输出_职场#include <stdio.h>
CH7-1 输入输出_职场// int sprintf(char *string, char *format, arg1, arg2, ...);
CH7-1 输入输出_职场//string的长度必须能容下format的长度,包括'\0'.
CH7-1 输入输出_职场int main(int argc, char** argv) {
CH7-1 输入输出_职场        char str[20];
CH7-1 输入输出_职场        sprintf(str, "Score is: %d \n", 34);
CH7-1 输入输出_职场        printf("%s\n", str);
CH7-1 输入输出_职场        return 0;
CH7-1 输入输出_职场}

7.3 函数参数个数可变举例
CH7-1 输入输出_职场#include <stdio.h>
CH7-1 输入输出_职场#include <stdarg.h> //va_start,va_arg,va_end
CH7-1 输入输出_职场//例子:函数参数个数可变
CH7-1 输入输出_职场void minprintf(char *format, ...){ //注意:...表示参数的个数和类型可变
CH7-1 输入输出_职场        va_list argumentPointer; //变量list
CH7-1 输入输出_职场        char *p;
CH7-1 输入输出_职场        int intVal;
CH7-1 输入输出_职场        double doubleVal;
CH7-1 输入输出_职场        char *strVal;
CH7-1 输入输出_职场
CH7-1 输入输出_职场        va_start(argumentPointer, format); //argumentPointer指向第一个无名参数
CH7-1 输入输出_职场
CH7-1 输入输出_职场        for(p = format; *p; p++){ //遍历format中的每一个字符
CH7-1 输入输出_职场                if(*p != '%'){             //如果不是%,则直接putchar打印出来
CH7-1 输入输出_职场                        putchar(*p);
CH7-1 输入输出_职场                        continue;
CH7-1 输入输出_职场                }
CH7-1 输入输出_职场                switch(*++p){             //如果是%,则判断其下一个字符
CH7-1 输入输出_职场                        case 'd':
CH7-1 输入输出_职场                                intVal = va_arg(argumentPointer, int); //va_arg以int型取一个参数,并将argumentPointer指向下一个参数
CH7-1 输入输出_职场                                printf("%d", intVal);
CH7-1 输入输出_职场                                break;
CH7-1 输入输出_职场                        case 'f':
CH7-1 输入输出_职场                                doubleVal = va_arg(argumentPointer, double);
CH7-1 输入输出_职场                                printf("%f", doubleVal);
CH7-1 输入输出_职场                                break;
CH7-1 输入输出_职场                        case 's':
CH7-1 输入输出_职场                                for(strVal = va_arg(argumentPointer, char*); *strVal; strVal++)
CH7-1 输入输出_职场                                        putchar(*strVal);
CH7-1 输入输出_职场                                break;
CH7-1 输入输出_职场                        default:
CH7-1 输入输出_职场                                putchar(*p);
CH7-1 输入输出_职场                                break;
CH7-1 输入输出_职场                }
CH7-1 输入输出_职场        }
CH7-1 输入输出_职场        va_end(argumentPointer);
CH7-1 输入输出_职场}
CH7-1 输入输出_职场
CH7-1 输入输出_职场int main(int argc, char** argv) {
CH7-1 输入输出_职场        minprintf("My name is: %s, age is: %d, height is: %f\n", "amao", 30, 165.5);
CH7-1 输入输出_职场        minprintf("My name is: %s, age is: %d\n", "stone", 22);
CH7-1 输入输出_职场        return 0;
CH7-1 输入输出_职场}

7.4  格式化输出 scanf
CH7-1 输入输出_职场#include <stdio.h>
CH7-1 输入输出_职场/*
CH7-1 输入输出_职场 * int scanf(char *format, arg1,...) //返回成功保存的参数个数
CH7-1 输入输出_职场 * 以format将标准输入保存到{参数指向的地址}中,arg1等参数必须为地址指针
CH7-1 输入输出_职场 *    
CH7-1 输入输出_职场 * int sscanf(char *string, char *format, arg1, arg2, ...);
CH7-1 输入输出_职场 * 从string中读取数据
CH7-1 输入输出_职场 */

CH7-1 输入输出_职场/*    
CH7-1 输入输出_职场 * d,u,i,o,x的前面可以加 h 表示short,l(ell)表示long
CH7-1 输入输出_职场 */

CH7-1 输入输出_职场void scanfInteger(){
CH7-1 输入输出_职场        int n;
CH7-1 输入输出_职场        scanf("%d", &n);     //按照十进制将整数读入,并存在n的地址空间中
CH7-1 输入输出_职场        printf("%d\n", n);
CH7-1 输入输出_职场
CH7-1 输入输出_职场        scanf("%u", &n);     //按照十进制将无符号整数读入
CH7-1 输入输出_职场        printf("%d\n", n);
CH7-1 输入输出_职场
CH7-1 输入输出_职场        scanf("%i", &n);     //按照八进制(0开头)或者十六(0x开头)进制读入
CH7-1 输入输出_职场        printf("%d\n", n); //若输入017,输出15 //若输入0xf,输出15
CH7-1 输入输出_职场
CH7-1 输入输出_职场        scanf("%o", &n);     //按照八进制(0开头可有可无)读入
CH7-1 输入输出_职场        printf("%d\n", n); //若输入17,输出15 //若输入017,输出15
CH7-1 输入输出_职场
CH7-1 输入输出_职场        scanf("%x", &n);     //按十六进制(0x开头可有可无)读入
CH7-1 输入输出_职场        printf("%d\n", n); //若输入0xf,输出15 //若输入f,输出15
CH7-1 输入输出_职场}
CH7-1 输入输出_职场/*
CH7-1 输入输出_职场 * %c 读取下一个字符,注意有可能是空字符,若要录入第一个非空字符,请用%1s
CH7-1 输入输出_职场 * %c 相当于 getchar()
CH7-1 输入输出_职场 */

CH7-1 输入输出_职场int scanfCharString(){
CH7-1 输入输出_职场        char ch;
CH7-1 输入输出_职场        char str[20];        
CH7-1 输入输出_职场        scanf("%c, %s", &ch, str); //输入a,amao
CH7-1 输入输出_职场        printf("%c %s\n", ch, str);//输出a amao
CH7-1 输入输出_职场}
CH7-1 输入输出_职场/*
CH7-1 输入输出_职场 * f,e,g以不同的格式录入float,lf表示录入的double而非float
CH7-1 输入输出_职场 * 输入:12.34 12.34 12.34 12345.6789
CH7-1 输入输出_职场 * 输出:12.340000 1.234000e+01 12.34 12345.678900
CH7-1 输入输出_职场 */

CH7-1 输入输出_职场int scanfFloat(){
CH7-1 输入输出_职场        float    f1, f2, f3;
CH7-1 输入输出_职场        double d1;
CH7-1 输入输出_职场        scanf("%f %e %g %lf", &f1, &f2, &f3, &d1);    
CH7-1 输入输出_职场        printf("%f %e %g %f\n", f1, f2, f3, d1);
CH7-1 输入输出_职场}
CH7-1 输入输出_职场
CH7-1 输入输出_职场void sscanfTest(){
CH7-1 输入输出_职场        int n, num;
CH7-1 输入输出_职场        float f;
CH7-1 输入输出_职场        num = sscanf("123 12.34", "%d %f", &n, &f);
CH7-1 输入输出_职场        printf("n = %d f = %f num = %d \n", n, f, num);
CH7-1 输入输出_职场}
CH7-1 输入输出_职场
CH7-1 输入输出_职场int main1(int argc, char** argv) {
CH7-1 输入输出_职场        scanfInteger();
CH7-1 输入输出_职场        scanfCharString();
CH7-1 输入输出_职场        scanfFloat();
CH7-1 输入输出_职场        sscanfTest();                
CH7-1 输入输出_职场        return 0;
CH7-1 输入输出_职场}
例子:
CH7-1 输入输出_职场#include <stdio.h>
CH7-1 输入输出_职场
CH7-1 输入输出_职场void acc(){
CH7-1 输入输出_职场        float i, sum = 0;
CH7-1 输入输出_职场        while(scanf("%f", &i) == 1)
CH7-1 输入输出_职场                printf("%.2f\n", sum += i);
CH7-1 输入输出_职场}
CH7-1 输入输出_职场
CH7-1 输入输出_职场int getline(char *line, int max){ //fgets从文件中读一行
CH7-1 输入输出_职场        if(fgets(line, max, stdin) == NULL) //stdin标准输入
CH7-1 输入输出_职场                return 0;
CH7-1 输入输出_职场        else
CH7-1 输入输出_职场                return strlen(line);    //strlen返回字符串line的长度
CH7-1 输入输出_职场}
CH7-1 输入输出_职场
CH7-1 输入输出_职场void time(){
CH7-1 输入输出_职场        int day, month, year;
CH7-1 输入输出_职场        char monthName[20];
CH7-1 输入输出_职场        
CH7-1 输入输出_职场        char line[20];    //思考:为什么char *line不行???
CH7-1 输入输出_职场        while(getline(line, sizeof(line)) > 0){    
CH7-1 输入输出_职场                if(sscanf(line, "%d %s %d", &day, monthName, &year) == 3)
CH7-1 输入输出_职场                        printf("valid: %s\n", line);    //输入31 sep 2001
CH7-1 输入输出_职场                else if(sscanf(line, "%d/%d/%d", &month, &day, &year) == 3)
CH7-1 输入输出_职场                        printf("valid: %s\n", line);    //输入9/31/2001 mm/dd/yy
CH7-1 输入输出_职场                else printf("invalid: %s\n", line);
CH7-1 输入输出_职场        }
CH7-1 输入输出_职场}
CH7-1 输入输出_职场
CH7-1 输入输出_职场int main(int argc, char** argv) {
CH7-1 输入输出_职场        acc();
CH7-1 输入输出_职场        time();
CH7-1 输入输出_职场        return 0;
CH7-1 输入输出_职场}

注意:
CH7-1 输入输出_职场#include <stdio.h>
CH7-1 输入输出_职场
CH7-1 输入输出_职场int main(int argc, char** argv) {
CH7-1 输入输出_职场        char str1[20], *str2;    //str1是一段空间的头地址
CH7-1 输入输出_职场        scanf("%s", str1);
CH7-1 输入输出_职场        
CH7-1 输入输出_职场        //scanf("%s", str2); //错误,原因是str2只是声明为一个char型指针,其还未开辟空间,故不能接收字符串
CH7-1 输入输出_职场        //printf("%s %s\n", str1, str2);
CH7-1 输入输出_职场
CH7-1 输入输出_职场        str2 = str1; //str2指向了str1开始的空间
CH7-1 输入输出_职场        scanf("%s", str2);
CH7-1 输入输出_职场        printf("%s %s\n", str1, str2);    
CH7-1 输入输出_职场}