C語言數據輸入與輸出

1 概論

C語言提供了跨平臺的數據輸入輸出函數scanf()和printf()函數,它們能夠按照指定的格式來解析常見的數據類型,例如整數,浮點數,字符和字符串等等。數據輸入的來源能夠是文件,控制檯以及網絡,而輸出的終端能夠是控制檯,文件甚至是網頁。html

2 數據輸出

從第一個C語言程序中,就使用了跨平臺的庫函數printf實現將一段文字輸出到控制檯,而實際上,printf()不只能夠將數據按照指定的格式輸出到控制檯,還能夠是網頁或者是指定的文件中,printf()函數執行的返回結果是輸出字符的個數。正則表達式

2.1 輸出數據到網頁

使用printf函數將數據按照指定的格式輸出到網頁的使用案例,目前咱們公司內部的IT系統還有用C語言寫的網頁程序(cgi)。express

#include <stdio.h> /* 使用printf輸出數據到網頁 @author Tony 18601767221@163.com @since 20160530 09:04 */ void printf_html() { //將生成的exe程序改爲cgi就能夠部署在Web服務器例如Apache中的cgi-bin目錄中運行了就能夠訪問了。 //而後經過主機名+端口+文件名.cgi的方式訪問 printf("Content-type:text/html \n\n");//聲明輸出的數據格式是HTML語言 printf("Hello World In HTML"); }

2.2 整數格式化輸出

printf()函數的強大之處在於格式化顯示輸出整數,浮點數,字符以及字符串到文件,網頁。同時在控制檯咱們可使用這個函數來調試程序或者獲取方法的返回值等等。 
printf函數的表現形式爲:printf(「格式化字符串數據」,可變參數列表) 
printf只會按照傳遞的參數類型解析數據,不會進行數據類型轉換,傳入的參數類型和個數和輸出的類型和個數保持一致,否則程序運行時會出異常數組

使用printf打印字符串,整數和字符的案例服務器

#include <stdio.h> /* 使用printf格式化輸出數據 @author Tony 18601767221@163.com @since 20160530 09:14 */ void printf_sample() { //最終都是以字符串的方式打印輸出 printf("Hello World \n");//輸出字符串常量,默認是輸出到控制檯 //printf顯示不一樣數據類型的數據 printf("個人名字叫%s,個人年齡是%d個人幸運字符是%c\n","Tony",28,'C'); }

printf在打印輸出整數時,不只能夠按照三種不一樣的進制類型(八進制,十進制和十六進制),同時還能夠按照有符號和無符號兩種方式打印整數。 
以及控制輸出字符的寬度等等:微信

#include <stdio.h> /* 輸出指定格式的整數數據 若是要在網頁下顯示數據,還須要使用printf實現匹配不一樣的數據格式 @author Tony 18601767221@163.com @since 20160530 09:20 */ void printf_format_int() { const int num = 10; printf("%d",num);//默認的格式是有多寬 填充多寬 printf("%d\t%ld",num,num);//32位以上的系統%d和%ld是等效的 inth和long是等效的 printf("%10d\n",num);//寬度爲10,數據顯示默認是右邊對齊 printf("%010d\n",num);//寬度爲10,若是不足則用0來補充 printf("%-10d\n",num);//寬度爲10,默認是按照右邊對齊, "-"表示左邊對齊 printf("%3d\n",12345); //12345大於實際寬度,3d的格式無效,不足使用空格填充 /* 輸出指定格式的整數(有無符號類型以及三種進制類型的)數據 若是要在網頁下顯示數據,還須要匹配不一樣的格式 @author Tony 18601767221@163.com @since 20160530 10:11 */ void printf_format_int_data_type() { const int num = 10; printf("%d\n", num);//有符號十進制 printf("%i\n",num); printf("%u\n",num); //無符號十進制 printf("%o\n",num);//無符號八進制 printf("%x\n",num); //無符號十六進制 } /* @author Tony 18601767221@163.com @since 20160530 21:53 */ void printf_format_int_unsinged() { unsigned short int uvalue = 65535; short int num = 123; printf("uvalue =%hu\tnum=%hd",uvalue,num); }

2.3 浮點數格式化輸出

printf在打印輸出浮點數時,整數所有輸出,默認保持小數點後六位,能夠按照小數和科學計數法(天文數字使用科學計數法存儲節約內存)計數法兩種方式,同時能夠控制輸出的小數位數和寬度:網絡

#include <stdio.h> /* 輸出指定格式的浮點數數據 @author Tony 18601767221@163.com @since 20160530 10:06 */ void printf_format_double() { const double num = 3.14159265359; printf("num=%.2f\n", num);//小數點後保留兩位 printf("num=%030.10f\n",num);//寬度爲30,不足用0補齊,不然按實際寬度輸出 //科學計數法表示 double depth = 1234567000000.0; printf("depth=%e\n",depth);//指數表示 double value = 1.23456789;// %g 自動選擇寬度少的顯示數據 %f.%e printf("value=%f\tvalue=%e\tvalue=%g",value,value,value); }

2.4 格式化輸出字符和字符串

printf在輸出字符時經過%c格式符來輸出,同時提供了putchar()函數來輸出一個字符:app

#include <stdio.h> /* 格式化輸出字符 @author Tony 186017672212163.com @since 20160530 10:15 */ void printf_char() { char ch = 'A'; printf("ch=%c\n",ch); putchar(ch); }

printf在輸出字符串時,能夠經過sprintf函數實現將字符串按照指定的格式拼接:函數

#include <stdio.h> /* 輸出指定格式的字符串數據 @author Tony 18601767221@163.com @since 20160530 10:08 */ void printf_format_string() { char str[100] = "calc"; //輸出字符串 printf("%s\n",str); } /* 使用sprintf函數實現字符串拼接 @author Tony 18601767221@163.com @since 20160530 10:32 */ void sprintf_string_append() { char command[100] = { 0 }; sprintf(command, "color %c%c", '4', 'f');//將整數 實數和字符串整合到一個字符串 printf("整合的結果爲%s\n", command); system(command); system("pause"); char com[10] = "task"; char mand[10] = "listerror"; //command = com + mand; C語言沒有Java語言中的字符串以加號的方式拼接 /* %s%s表示字符串拼接 %.4s 從左邊截取4位,只能從左邊截取(從某一地址從左向右開始截取) -左邊對齊 */ sprintf(command,"%s%.4s",com,mand);// printf("%s\n",command); system(command); system("pause"); }

使用sprintf函數結合字符串指針實現身份證的出生日期信息獲取ui

/* 經過sprintf截取身份證的出身年月日 @author Tony 18601767221@163.com @since 20160601 14:29 */ void sprintf_id() { char id[19] = "421023198902345678"; //字符串是以\0結尾 所以要多出一個字符長度 printf("身份證號爲%s",id); char bornDate[9] = {0}; //初始化一個字符串保存出生日期 sprintf(bornDate,"%-.8s",id+6);//地址向後移動六位 printf("出身年月日爲%s\n",bornDate); } 

2.5 printf格式化輸出數據的參數總結

格式符 解析方式
%hd 有符號十進制短整數(short)
%hu 無符號十進制短整數(unsinged short)
%d 有符號十進制整數(int或者long)
%lld 有符號十進制整數(long long)
%#o 無符號八進制整數(#代表進制)
%#x/%#X 無符號十六進制整數(#代表進制,大小寫決定了輸出數據的字母大小寫)
%u 無符號十進制整數
%llu 無符號十進制整數(long long)用於存儲身份證號
%c 字符
%s 字符串
%p 指針地址
%f 浮點數
%a 十六進制浮點數
%e/%E 指數形式的浮點數
%g f和e相比寬度更小的浮點數

3 數據輸入

scanf()函數主要是用於讀取數據(一般來源於文件或者是用戶從鍵盤的輸入),而且按照指定的格式精確匹配(不能遺漏任何字符),絕大多解析數據的數據格式都和printf()一致。在掃描讀取整數,浮點數和字符時一般變量名要加上地址符(&),在掃描讀取字符串時變量名不須要加上地址符。scanf函數返回的是成功讀取輸入數據的個數

scanf()函數的通常形式是scanf(「格式字符串」,變量地址表)

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> /* scanf讀取用戶從鍵盤的輸入數據 @author Tony 18610767221@163.com @since 20160601 16:59 */ void scanf_sample() { int num = 0; printf("num變量的地址爲:%p\n",&num); //打印變量的內存地址 scanf("num=%d",&num); //根據地址對應的變量值對變量進行初始化賦值 控制檯中應該輸入num=整數值(例如12) printf("num=%d\n",num); int x = 1, y = 2, z = 3;//聲明多個整數 scanf("x=%d,y=%d,z=%d",&x,&y,&z);//命令行窗口應該輸入x=整數值,y=整數值,z=整數值 格式字符串必須徹底匹配 printf("x=%d,y=%d,z=%d",x,y,z); system("pause"); }

在使用scanf函數進行讀取數據的匹配時,若是數據類型是字符串,會忽略回車。

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> /* scanf精確匹配 @author Tony 18601767221@163.com @since 20160601 17:25 */ void scanf_match() { //當使用字符串(字符數組)時,輸入回車會被忽略 int num=123; char str[100] = { 0 }; scanf("%d", &num);//掃描讀取num scanf("%s",str);//掃描讀取字符串 printf("num=%d\n",num); printf("str=%s\n",str); system("pause"); }

使用sscanf實現數據挖掘的案例: 
一次性讀取多個數據時可使用回車鍵 空格或者是Tab實現數據讀取結束符

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> /* 使用sscanf函數實現數據挖掘 @author Tony 18601767221@163.com @since 201060601 17:34 */ void scanf_match_data() { char data[300] = "身高 170 年齡 22 體重 96 ";//空格表示讀取結束 int height = 0; int age = 0; //使用sscanfh函數讀取字符串到變量中,按照指定的格式匹配 sscanf(data, "%*s %d %*s %d %*s",&height,&age); //按照指定的格式進行數據解析,並讀取到變量中 printf("height=%d\nage=%d\n",height,age); height >= 170 && (age >= 20 && age <= 22)?printf("是女神標準\n"):printf("不是女神標準\n"); char info[300] = "QQ,1079351401,手機,18601767221,郵箱,18601767221@163.com"; long long qq = 0; long long mobilePhone = 0; char email[30] = {0}; //先對字符串中的逗號,轉換成空格 由於當sscanf函數進行字符串解析時,會將逗號後面的內容都看成字符串 for (int i = 0; i < 300;i++) { if (info[i]==',') { info[i] = ' '; } } //%*s表示忽略該字符串的內容 sscanf(info,"%*s %lld %*s %lld %*s %s",&qq,&mobilePhone,email); printf("qq=%lld\nmobilePhone=%lld\nemail=%s\n",qq,mobilePhone,email); system("pause"); }

在使用scanf函數讀取數據時,若是讀取的是浮點數,則不能指定精度。

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> /* scanf函數的使用注意事項 @author Tony 18601767221@163.com @since 20160602 10:00 */ void scanf_app() { float fl = 0; printf("請輸入一個浮點數\n"); scanf("%7.2f",&fl);//scanf匹配浮點數時不能指定精度,此處將會解析數據錯誤 printf("fl=%f\n",fl); system("pause"); }

在使用scanf讀取字符數據時,回車,轉義字符等都會看成一個有效的字符

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> /* scanf函數的使用注意事項 @author Tony 18601767221@163.com @since 20160602 10:00 */ void scanf_app() { char ch1='0'; char ch2 = '0'; scanf("%c,%c",&ch1,&ch2); printf("ch1=[%c],ch2=[%c]",ch1,ch2);//回車符也會被看成輸入的一個字符 system("pause"); }

使用scanf函數結合正則表達式掃描匹配指定正則的數據

/* scanfh函數結合正則表達式的使用 @author Tony 18601767221@163.com @since 20160604 20:43 */ void scanf_regualr_express() { //正則表達式就是一組驗證數據的規則,經常使用在網頁中的郵箱,密碼等用戶數據的驗證 char str[200] = {0}; //scanf("%s",str);//默認是以回車中斷讀取數據 //scanf("%[^\n]",str);//處理空格 以回車做爲結束讀取 //scanf("%[^=]", str);//讀取非=的數據 等號(=)做爲結束讀取(讀取的結果不包含等號) //scanf("%[^,]", str);//讀取非(^)逗號的數據 逗號(,)做爲結束讀取(讀取的結果不包含逗號) //printf("%s\n",str); //數字匹配(手機號) 0-9 //scanf("%[0-9]",str);//讀取電話號碼 //printf("%s\n", str); //字母匹配a-zA-Z scanf("%[a-zA-Z]", str);//讀取字母,遇到非大小寫字母結束,若是讀取的字符串開頭不匹配 輸出爲空 printf("%s\n", str); //大寫字母匹配A-Z scanf("%[A-Z]", str);//讀取字母,遇到非大寫字母結束,若是讀取的字符串開頭不匹配 輸出爲空 printf("%s\n", str); //小寫字母匹配a-z scanf("%[a-z]", str);//讀取字母,遇到非小寫字母結束,若是讀取的字符串開頭不匹配 輸出爲空 printf("%s\n", str); }

歡迎掃描下方的二維碼,關注微信公衆服務號-藝無止境,分享IT技術乾貨。 
藝無止境

相關文章
相關標籤/搜索