C語(yǔ)言數(shù)據(jù)輸入與輸出實(shí)例詳解
C語(yǔ)言數(shù)據(jù)輸入與輸出實(shí)例詳解
1 概論
C語(yǔ)言提供了跨平臺(tái)的數(shù)據(jù)輸入輸出函數(shù)scanf()和printf()函數(shù),它們可以按照指定的格式來(lái)解析常見的數(shù)據(jù)類型,例如整數(shù),浮點(diǎn)數(shù),字符和字符串等等。數(shù)據(jù)輸入的來(lái)源可以是文件,控制臺(tái)以及網(wǎng)絡(luò),而輸出的終端可以是控制臺(tái),文件甚至是網(wǎng)頁(yè)。
2 數(shù)據(jù)輸出
從第一個(gè)c語(yǔ)言程序中,就使用了跨平臺(tái)的庫(kù)函數(shù)printf實(shí)現(xiàn)將一段文字輸出到控制臺(tái),而實(shí)際上,printf()不僅可以將數(shù)據(jù)按照指定的格式輸出到控制臺(tái),還可以是網(wǎng)頁(yè)或者是指定的文件中,printf()函數(shù)執(zhí)行的返回結(jié)果是輸出字符的個(gè)數(shù)。
2.1 輸出數(shù)據(jù)到網(wǎng)頁(yè)
使用printf函數(shù)將數(shù)據(jù)按照指定的格式輸出到網(wǎng)頁(yè)的使用案例,目前我們公司內(nèi)部的IT系統(tǒng)還有用C語(yǔ)言寫的網(wǎng)頁(yè)程序(cgi)。
#include <stdio.h> /* 使用printf輸出數(shù)據(jù)到網(wǎng)頁(yè) @author Tony 18601767221@163.com @since 20160530 09:04 */ void printf_html() { //將生成的exe程序改成cgi就可以部署在Web服務(wù)器例如Apache中的cgi-bin目錄中運(yùn)行了就可以訪問(wèn)了。 //然后通過(guò)主機(jī)名+端口+文件名.cgi的方式訪問(wèn) printf("Content-type:text/html \n\n");//聲明輸出的數(shù)據(jù)格式是HTML語(yǔ)言 printf("Hello World In HTML"); }
2.2 整數(shù)格式化輸出
printf()函數(shù)的強(qiáng)大之處在于格式化顯示輸出整數(shù),浮點(diǎn)數(shù),字符以及字符串到文件,網(wǎng)頁(yè)。同時(shí)在控制臺(tái)我們可以使用這個(gè)函數(shù)來(lái)調(diào)試程序或者獲取方法的返回值等等。
printf函數(shù)的表現(xiàn)形式為:printf(“格式化字符串?dāng)?shù)據(jù)”,可變參數(shù)列表)
printf只會(huì)按照傳遞的參數(shù)類型解析數(shù)據(jù),不會(huì)進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換,傳入的參數(shù)類型和個(gè)數(shù)和輸出的類型和個(gè)數(shù)保持一致,不然程序運(yùn)行時(shí)會(huì)出異常
使用printf打印字符串,整數(shù)和字符的案例
#include <stdio.h> /* 使用printf格式化輸出數(shù)據(jù) @author Tony 18601767221@163.com @since 20160530 09:14 */ void printf_sample() { //最終都是以字符串的方式打印輸出 printf("Hello World \n");//輸出字符串常量,默認(rèn)是輸出到控制臺(tái) //printf顯示不同數(shù)據(jù)類型的數(shù)據(jù) printf("我的名字叫%s,我的年齡是%d我的幸運(yùn)字符是%c\n","Tony",28,'C'); }
printf在打印輸出整數(shù)時(shí),不僅可以按照三種不同的進(jìn)制類型(八進(jìn)制,十進(jìn)制和十六進(jìn)制),同時(shí)還可以按照有符號(hào)和無(wú)符號(hào)兩種方式打印整數(shù)。
以及控制輸出字符的寬度等等:
#include <stdio.h> /* 輸出指定格式的整數(shù)數(shù)據(jù) 如果要在網(wǎng)頁(yè)下顯示數(shù)據(jù),還需要使用printf實(shí)現(xiàn)匹配不同的數(shù)據(jù)格式 @author Tony 18601767221@163.com @since 20160530 09:20 */ void printf_format_int() { const int num = 10; printf("%d",num);//默認(rèn)的格式是有多寬 填充多寬 printf("%d\t%ld",num,num);//32位以上的系統(tǒng)%d和%ld是等效的 inth和long是等效的 printf("%10d\n",num);//寬度為10,數(shù)據(jù)顯示默認(rèn)是右邊對(duì)齊 printf("%010d\n",num);//寬度為10,如果不足則用0來(lái)補(bǔ)充 printf("%-10d\n",num);//寬度為10,默認(rèn)是按照右邊對(duì)齊, "-"表示左邊對(duì)齊 printf("%3d\n",12345); //12345大于實(shí)際寬度,3d的格式無(wú)效,不足使用空格填充 /* 輸出指定格式的整數(shù)(有無(wú)符號(hào)類型以及三種進(jìn)制類型的)數(shù)據(jù) 如果要在網(wǎng)頁(yè)下顯示數(shù)據(jù),還需要匹配不同的格式 @author Tony 18601767221@163.com @since 20160530 10:11 */ void printf_format_int_data_type() { const int num = 10; printf("%d\n", num);//有符號(hào)十進(jìn)制 printf("%i\n",num); printf("%u\n",num); //無(wú)符號(hào)十進(jìn)制 printf("%o\n",num);//無(wú)符號(hào)八進(jìn)制 printf("%x\n",num); //無(wú)符號(hào)十六進(jìn)制 } /* @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 浮點(diǎn)數(shù)格式化輸出
printf在打印輸出浮點(diǎn)數(shù)時(shí),整數(shù)全部輸出,默認(rèn)保持小數(shù)點(diǎn)后六位,可以按照小數(shù)和科學(xué)計(jì)數(shù)法(天文數(shù)字使用科學(xué)計(jì)數(shù)法存儲(chǔ)節(jié)約內(nèi)存)計(jì)數(shù)法兩種方式,同時(shí)可以控制輸出的小數(shù)位數(shù)和寬度:
#include <stdio.h> /* 輸出指定格式的浮點(diǎn)數(shù)數(shù)據(jù) @author Tony 18601767221@163.com @since 20160530 10:06 */ void printf_format_double() { const double num = 3.14159265359; printf("num=%.2f\n", num);//小數(shù)點(diǎn)后保留兩位 printf("num=%030.10f\n",num);//寬度為30,不足用0補(bǔ)齊,否則按實(shí)際寬度輸出 //科學(xué)計(jì)數(shù)法表示 double depth = 1234567000000.0; printf("depth=%e\n",depth);//指數(shù)表示 double value = 1.23456789;// %g 自動(dòng)選擇寬度少的顯示數(shù)據(jù) %f.%e printf("value=%f\tvalue=%e\tvalue=%g",value,value,value); }
2.4 格式化輸出字符和字符串
printf在輸出字符時(shí)通過(guò)%c格式符來(lái)輸出,同時(shí)提供了putchar()函數(shù)來(lái)輸出一個(gè)字符:
#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在輸出字符串時(shí),可以通過(guò)sprintf函數(shù)實(shí)現(xiàn)將字符串按照指定的格式拼接:
#include <stdio.h> /* 輸出指定格式的字符串?dāng)?shù)據(jù) @author Tony 18601767221@163.com @since 20160530 10:08 */ void printf_format_string() { char str[100] = "calc"; //輸出字符串 printf("%s\n",str); } /* 使用sprintf函數(shù)實(shí)現(xiàn)字符串拼接 @author Tony 18601767221@163.com @since 20160530 10:32 */ void sprintf_string_append() { char command[100] = { 0 }; sprintf(command, "color %c%c", '4', 'f');//將整數(shù) 實(shí)數(shù)和字符串整合到一個(gè)字符串 printf("整合的結(jié)果為%s\n", command); system(command); system("pause"); char com[10] = "task"; char mand[10] = "listerror"; //command = com + mand; C語(yǔ)言沒有Java語(yǔ)言中的字符串以加號(hào)的方式拼接 /* %s%s表示字符串拼接 %.4s 從左邊截取4位,只能從左邊截取(從某一地址從左向右開始截取) -左邊對(duì)齊 */ sprintf(command,"%s%.4s",com,mand);// printf("%s\n",command); system(command); system("pause"); }
使用sprintf函數(shù)結(jié)合字符串指針實(shí)現(xiàn)身份證的出生日期信息獲取
/* 通過(guò)sprintf截取身份證的出身年月日 @author Tony 18601767221@163.com @since 20160601 14:29 */ void sprintf_id() { char id[19] = "421023198902345678"; //字符串是以\0結(jié)尾 因此要多出一個(gè)字符長(zhǎng)度 printf("身份證號(hào)為%s",id); char bornDate[9] = {0}; //初始化一個(gè)字符串保存出生日期 sprintf(bornDate,"%-.8s",id+6);//地址向后移動(dòng)六位 printf("出身年月日為%s\n",bornDate); }
2.5 printf格式化輸出數(shù)據(jù)的參數(shù)總結(jié)
格式符 | 解析方式 |
---|---|
%hd | 有符號(hào)十進(jìn)制短整數(shù)(short) |
%hu | 無(wú)符號(hào)十進(jìn)制短整數(shù)(unsinged short) |
%d | 有符號(hào)十進(jìn)制整數(shù)(int或者long) |
%lld | 有符號(hào)十進(jìn)制整數(shù)(long long) |
%#o | 無(wú)符號(hào)八進(jìn)制整數(shù)(#表明進(jìn)制) |
%#x/%#X | 無(wú)符號(hào)十六進(jìn)制整數(shù)(#表明進(jìn)制,大小寫決定了輸出數(shù)據(jù)的字母大小寫) |
%u | 無(wú)符號(hào)十進(jìn)制整數(shù) |
%llu | 無(wú)符號(hào)十進(jìn)制整數(shù)(long long)用于存儲(chǔ)身份證號(hào) |
%c | 字符 |
%s | 字符串 |
%p | 指針地址 |
%f | 浮點(diǎn)數(shù) |
%a | 十六進(jìn)制浮點(diǎn)數(shù) |
%e/%E | 指數(shù)形式的浮點(diǎn)數(shù) |
%g | f和e相比寬度更小的浮點(diǎn)數(shù) |
3 數(shù)據(jù)輸入
scanf()函數(shù)主要是用于讀取數(shù)據(jù)(通常來(lái)源于文件或者是用戶從鍵盤的輸入),并且按照指定的格式精確匹配(不能遺漏任何字符),絕大多解析數(shù)據(jù)的數(shù)據(jù)格式都和printf()一致。在掃描讀取整數(shù),浮點(diǎn)數(shù)和字符時(shí)通常變量名要加上地址符(&),在掃描讀取字符串時(shí)變量名不需要加上地址符。scanf函數(shù)返回的是成功讀取輸入數(shù)據(jù)的個(gè)數(shù)
scanf()函數(shù)的一般形式是scanf(“格式字符串”,變量地址表)
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> /* scanf讀取用戶從鍵盤的輸入數(shù)據(jù) @author Tony 18610767221@163.com @since 20160601 16:59 */ void scanf_sample() { int num = 0; printf("num變量的地址為:%p\n",&num); //打印變量的內(nèi)存地址 scanf("num=%d",&num); //根據(jù)地址對(duì)應(yīng)的變量值對(duì)變量進(jìn)行初始化賦值 控制臺(tái)中應(yīng)該輸入num=整數(shù)值(例如12) printf("num=%d\n",num); int x = 1, y = 2, z = 3;//聲明多個(gè)整數(shù) scanf("x=%d,y=%d,z=%d",&x,&y,&z);//命令行窗口應(yīng)該輸入x=整數(shù)值,y=整數(shù)值,z=整數(shù)值 格式字符串必須完全匹配 printf("x=%d,y=%d,z=%d",x,y,z); system("pause"); }
在使用scanf函數(shù)進(jìn)行讀取數(shù)據(jù)的匹配時(shí),如果數(shù)據(jù)類型是字符串,會(huì)忽略回車。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> /* scanf精確匹配 @author Tony 18601767221@163.com @since 20160601 17:25 */ void scanf_match() { //當(dāng)使用字符串(字符數(shù)組)時(shí),輸入回車會(huì)被忽略 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實(shí)現(xiàn)數(shù)據(jù)挖掘的案例:
一次性讀取多個(gè)數(shù)據(jù)時(shí)可以使用回車鍵 空格或者是Tab實(shí)現(xiàn)數(shù)據(jù)讀取結(jié)束符
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> /* 使用sscanf函數(shù)實(shí)現(xiàn)數(shù)據(jù)挖掘 @author Tony 18601767221@163.com @since 201060601 17:34 */ void scanf_match_data() { char data[300] = "身高 170 年齡 22 體重 96 ";//空格表示讀取結(jié)束 int height = 0; int age = 0; //使用sscanfh函數(shù)讀取字符串到變量中,按照指定的格式匹配 sscanf(data, "%*s %d %*s %d %*s",&height,&age); //按照指定的格式進(jìn)行數(shù)據(jù)解析,并讀取到變量中 printf("height=%d\nage=%d\n",height,age); height >= 170 && (age >= 20 && age <= 22)?printf("是女神標(biāo)準(zhǔn)\n"):printf("不是女神標(biāo)準(zhǔn)\n"); char info[300] = "QQ,1079351401,手機(jī),18601767221,郵箱,18601767221@163.com"; long long qq = 0; long long mobilePhone = 0; char email[30] = {0}; //先對(duì)字符串中的逗號(hào),轉(zhuǎn)換成空格 因?yàn)楫?dāng)sscanf函數(shù)進(jìn)行字符串解析時(shí),會(huì)將逗號(hào)后面的內(nèi)容都當(dāng)作字符串 for (int i = 0; i < 300;i++) { if (info[i]==',') { info[i] = ' '; } } //%*s表示忽略該字符串的內(nèi)容 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函數(shù)讀取數(shù)據(jù)時(shí),如果讀取的是浮點(diǎn)數(shù),則不能指定精度。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> /* scanf函數(shù)的使用注意事項(xiàng) @author Tony 18601767221@163.com @since 20160602 10:00 */ void scanf_app() { float fl = 0; printf("請(qǐng)輸入一個(gè)浮點(diǎn)數(shù)\n"); scanf("%7.2f",&fl);//scanf匹配浮點(diǎn)數(shù)時(shí)不能指定精度,此處將會(huì)解析數(shù)據(jù)錯(cuò)誤 printf("fl=%f\n",fl); system("pause"); }
在使用scanf讀取字符數(shù)據(jù)時(shí),回車,轉(zhuǎn)義字符等都會(huì)當(dāng)作一個(gè)有效的字符
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> /* scanf函數(shù)的使用注意事項(xiàng) @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);//回車符也會(huì)被當(dāng)作輸入的一個(gè)字符 system("pause"); }
使用scanf函數(shù)結(jié)合正則表達(dá)式掃描匹配指定正則的數(shù)據(jù)
/* scanfh函數(shù)結(jié)合正則表達(dá)式的使用 @author Tony 18601767221@163.com @since 20160604 20:43 */ void scanf_regualr_express() { //正則表達(dá)式就是一組驗(yàn)證數(shù)據(jù)的規(guī)則,常用在網(wǎng)頁(yè)中的郵箱,密碼等用戶數(shù)據(jù)的驗(yàn)證 char str[200] = {0}; //scanf("%s",str);//默認(rèn)是以回車中斷讀取數(shù)據(jù) //scanf("%[^\n]",str);//處理空格 以回車作為結(jié)束讀取 //scanf("%[^=]", str);//讀取非=的數(shù)據(jù) 等號(hào)(=)作為結(jié)束讀取(讀取的結(jié)果不包含等號(hào)) //scanf("%[^,]", str);//讀取非(^)逗號(hào)的數(shù)據(jù) 逗號(hào)(,)作為結(jié)束讀取(讀取的結(jié)果不包含逗號(hào)) //printf("%s\n",str); //數(shù)字匹配(手機(jī)號(hào)) 0-9 //scanf("%[0-9]",str);//讀取電話號(hào)碼 //printf("%s\n", str); //字母匹配a-zA-Z scanf("%[a-zA-Z]", str);//讀取字母,遇到非大小寫字母結(jié)束,如果讀取的字符串開頭不匹配 輸出為空 printf("%s\n", str); //大寫字母匹配A-Z scanf("%[A-Z]", str);//讀取字母,遇到非大寫字母結(jié)束,如果讀取的字符串開頭不匹配 輸出為空 printf("%s\n", str); //小寫字母匹配a-z scanf("%[a-z]", str);//讀取字母,遇到非小寫字母結(jié)束,如果讀取的字符串開頭不匹配 輸出為空 printf("%s\n", str); }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
上一篇:c++10進(jìn)制轉(zhuǎn)換為任意2-16進(jìn)制數(shù)字的實(shí)例
欄 目:C語(yǔ)言
下一篇:C語(yǔ)言實(shí)現(xiàn)樹的動(dòng)態(tài)查找實(shí)例代碼
本文標(biāo)題:C語(yǔ)言數(shù)據(jù)輸入與輸出實(shí)例詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1430.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery