缓冲区和数组的输入输出问题
? ? 最近編寫程序的時候一直被數據的輸入輸出所困擾,由此寫篇博文總結一下最近遇到的問題和解決方法,錯誤之處望指正。
? ? 1.數組使用的一些語法注意事項
? ? ?(1)數組的定義
? ? ? ? ? ? ? ?一維數組:類型名 ?數組名 [常量表達式]
? ? ? ? ? ? ? ?常量表達式中可以包括常量和符號常量,如int a[3+5]合法,int [a]不合法,即C語言不允許對數組的大小進行動態(tài)定義。
? ? ? ? ? ? ? ?如果在被調用函數中(不包括主函數)定義數組,其長度可以是變量或者是非常量表達式,如:
void fun(int n)
{int a[2*n].............
}? ? ? ? ? ? ? ?在調用fun函數時,形參n從實參得到值,這種情況被稱為“可變長數組”,允許在每次調用fun函數時,n有不同的值。但是在執(zhí)行的時候,n的值是不可變的,數組長度是固定的。如果指定數組為靜態(tài)(static),存儲方式,則不能使用“可變長數組”,如static int a[2*n],不合法。
? ? ? ? ? ? ? ?二維數組:類型名 ?數組名 [常量表達式][常量表達式]
? ? ? ? ? ? ? ? int arr[3][4],可以把arr[0],arr[1],arr[2],看成是數組名,即二維數組可以理解為數組的數組
? ? ? (2)數組的初始化
? ? ? ? ? ? ? ? 定義數組的時候賦初值,并指定數組的長度:int arr[5] = {1,2,3,4,5}
? ? ? ? ? ? ? ? 定義數組的時候賦初值,不指定數組的長度,此時系統(tǒng)會根據初值的個數確定數組的長度,int arr[] = {1,2,3,4,5},數組的長度為5
? ? ? ? ? ? ? ?定義數組的時候賦部分值:int arr[5] = {1,2},只給前二個賦值,系統(tǒng)會自動給后面三個賦初值為0,此時如果將數組里面的數據打印出來的話,打印的結果是12000。
? ? ? ? ? ? ? ?定義數組時,如果已經定義了數組的長度并對之初始化,凡未被初始化的部分,系統(tǒng)會自動初始化,整型數組初始化為0,字符型數組初始化為'\0',指針數組為NULL。
? ? ? ? ? ? ? 二維數組初始化的幾種形式,int arr[2][3] = {{1,2,3},{4,5,6}},int arr[2][3] = {1,2,3,4,5,6},int arr[2][3] = {{1},{2}}(未被初始化的部分自定義為0),int arr[2][3] = {{1}}
? ? ? ? ? ? ?注意:如果全部元素都被賦初值,則定義數組時對第一維數組的長度可以不指定,但是第二維數組的長度不能省
? ?2.字符數組使用中的語法注意
? ? ?(1)字符數組的結束標志
? ? ? ? ? ? ? ? C語言規(guī)定字符數組的結束標志為'\0',這個字符不算數組的有效長度中去,'\0',在ASCII碼為0。
? ? ? ? ? ? ? ? 例如輸出一個字符串,printf("I am happy\n");,在內存中存儲時,系統(tǒng)會自動的在'\n'的后面加上一個'\0',在執(zhí)行printf函數時,每輸出一個字符檢查一次,看下一個字符是否為'\0',遇到'\0'的時候停止輸出。
? ? ? (2)字符數組初始化
char ch[10] = {'I',' ','a','m',' ','h','a','p','p','y'};? ? ? ? ? ? ? 如果字符的個數大于字符數組的長度,則語法錯誤,如果初始化字符的個數,小于數組的長度,系統(tǒng)會自動補'\0'
char ch[] = {'I',' ','a','m',' ','h','a','p','p','y'};? ? ? ? ? ? ? 如果定義時長度不確定,系統(tǒng)會根據初始化的字符個數確定數組長度,此時數組的長度為10,如果我們以字符串的形式同樣的輸入上面的字符,則數組的長度不是10,而是11,因為系統(tǒng)會自動的在后面加上'\0'。下面截圖可以看出單個字符和字符串初始化數組的區(qū)別
?
但是此時如果用printf("%s",arr1),將數組打印出來時,'\0'是不會被打印出來的
3.緩沖區(qū)和數組的輸入輸出問題
? ?(1)逐個字符的輸入和輸出用"%c",字符串的輸入和輸出用"%s",如scanf("%s",arr);此時輸入字符串時,輸入的字符串的長度應該小于已經定義的字符數組的長度,因為系統(tǒng)會自動的不'\0',如果是單個字符輸入時,輸入的數據的長度可以是定義的字符數組的長度。如果利用一個scanf()輸入多個字符串,輸入時應該以空格隔開如
char str1[5],str2[5],str3[5];scanf("%s%s%s",str1,str2,str3);? ? ? ? ? 如果此時輸入"how are you",系統(tǒng)會分別把“how”,“are”,"you",賦值給str1,str2,str3
? ? ? ? ?注意:如果編寫以下程序,則不會達到想要的結果
char str[13];scanf("%s",str);? ? ? ? ? ?此時如果輸入"how are you",由于系統(tǒng)把空格當做是輸入字符串之間的空格符,因此只講空格前面的"how"賦值給了str,其余的部分補'\0'。還應該注意的是,scanf的輸入項中如果是字符數組名,不要在前面加&,因為C語言中,數組名代表的就是數組的首地址,如果我們使用printf("%o",str),此時是用八進制輸出數組str的首地址。
? ? ? ? ? 在使用VS2013時,系統(tǒng)為了更加安全會讓你使用scanf_s,此時的用法和scanf略有不同,不只需要傳數組名還需要傳入輸入字符串的長度如下
char arr[10];scanf_s("%s",arr,10);? ? ? ??
注意: 此時仍需要保證輸入的字符串的長度小于定義的字符數組的長度,如果輸入字符的個數超過數組的長度,就會把數組撐爆了,此時的scanf_s的返回值為0,如果用printf打印的話,則打印不了。,輸入字符的個數最大還應該比數組長度小1,因為系統(tǒng)會自動補'\0'。使用gets_s函數時的用法相類似,gets(arr,10)。
? ? ? ?注意:gets_s()使用時,就不存在用空格作為字符串的分隔符,如下
char arr[10];gets_s(arr,10);? ? ? ? ?如果此時輸入“hello ha”此時arr中存儲的就是“hello ha\0\0”
? ? (2)一些常見的字符串處理函數(字符串處理函數時,應包含頭文件<string.h>)
? ? ? ? ? ? puts(str):字符串輸出函數
? ? ? ? ? ? gets(str):字符串輸入函數,返回值是str的起始地址(put和gets只能輸入輸出一個字符串)
? ? ? ? ? ? strlen(str):測量字符串長度函數,測試結果是字符串的實際長度,不包括'\0'
? ? ? ? ? ? strcmp(str1,str2):字符串比較函數,比較規(guī)則是,將兩個字符串自左到右逐個比較(按ASCII碼值大小比較),直到出現不同的字符或者遇到'\0'為止,如果相等返回0,如果str1>str2返回一個正整數,否則返回一個負整數
? ? ? (3)字符輸入和輸入緩沖區(qū)的問題
? ? ? ? ? ? ?先說兩個單個字符的輸入和輸出函數getchar(),putchar(),具體用法不在熬述。先看下面的程序
(未完待續(xù),對不起)
? ? ? ? ? ??
總結
以上是生活随笔為你收集整理的缓冲区和数组的输入输出问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多囊卵巢综合症需要注意些什么
- 下一篇: github提交代码却没有显示绿格子