C语言基础知识整理
關于sizeof和strlen。Sizeof()用于計算某類型或者某變量在內存中所占空間。比如整數分為short型,int型,long整型,分別占2,2/4,4個字節,int型具體占用幾個字節和編譯系統有關。我們輸入字符串時通常用char數組:
Char s[10];
Scanf(“%s”,s);
輸入的字符串可能是中英文混雜的,英文就是一個個字母,一個字母就是一個char,占一個字節。而一個漢字占用兩個字節,這兩個字節是連續的,每個字節最高位是1.所以可以依據這個判斷一個字符串里面有多少漢字。
L=strlen(s); //這里用strlen,只是字符串長度(以字節為單位),不包括/0 For(num=i=0;i<l;i++) { If(s[i]<0) //有符號類型情況下,最高位1代表負數 Num++; Printf(“共%d個漢字”,num/2); //這里要除以2,因為兩個最高位為1的字節才是一個漢字 ? //#include "stdafx.h" #include <stdio.h> #include <string> #include <iostream> using namespace std; int main(void) {char a[] = { 'h', 'e', 'l', 'l', 'o' ,'\0'};char b[] = "hello";//定義字符串char c[] = { 'h', 'e', 'l', 'l', 'o' };char *p = b;cout << a << endl;cout << b<<endl;//輸出的是hellocout << c << endl;char *pchar = c;//以下語句實現用指針輸出hello。for (size_t i = 0; i < 5; i++){cout << *pchar;pchar++;}cout << "\n" << endl;cout << *p;//指針指向首地址,所以輸出為 hstring str = "hello world";string *p1 = &str; //注意必須加取地址運算符 &cout<< str << "," << *p1; //輸出的是 hello world,hello worldgetchar();return 1; }Char數組可以存放字符串,而且數組名就是字符串的地址。Scanf和cout都是對地址進行操作,所以cout<<b結果就是字符串。
Char數組按字母存放時,要想輸出字符串,要加字符串結束標識符\0,否則輸出的是亂碼。或者也可以利用指針一個個輸出字母
String其實是一個類,而不是數據類型。String的指針指向string對象,而不是第一個字符。
二者之間是可以相互轉換的。
l? 說到類,其實類就是一個構造數據類型,即用已經定義好的數據類型重新構造的新的數據類型。除了類,還有數組類型,結構體類型,枚舉類型,聯合體類型。
C語言中的結構體類型和c++中的類類型基本相同,只不過默認的限定符不同,c語言默認public,c++默認private
l? C++的麻煩之處就在于調用變量的方式。可以使用變量名,可以使用指針,還可以使用引用。程序實際是由函數構成的,包括多個子函數和一個主函數。而函數中參數的傳遞一般是按照值傳遞的,按照值的意思是會創建一個變量的副本,這個副本的值和參數的值相等。這樣副本的值在函數中改變的話并不會改變原來的變量的值。
l? 引用類型,在定義的時候在變量前面加一個&:
Int a;
Int&b=a;&c=a;? //b,c是a的兩個引用
引用變量是一個變量的別稱,沒有分配新的內存空間,這樣改變變量的值,所有的引用變量的值都會改變。
l? 說到函數與變量,還有一個概念那就是全局變量和局部變量,判斷的標準就是變量的定義放在函數外面還是函數內部。但全局變量和局部變量的區別沒有這么簡單,全局變量分配的空間位于內存空間中的“堆”,堆的存取速度慢,空間大;局部變量的空間位于內存中的“棧”,棧存取速度快,空間小。而且全局變量定義時有默認的初始值,比如整型全局變量的默認初始值是0.
l? 全局變量在所有函數中都可以訪問,所以如果參數傳遞是引用的話,會在函數中造成改變,影響其他函數,所以不經常使用全局變量。而在堆中有空間大的優勢,所以當我們要定義一個大的數組時,可以用靜態變量。
l? 靜態變量以static限定符修飾。即便定義在函數體內部,程序跳出時依然存在,而且保持原來的值不變。靜態變量的一個特點是只定義一次,只在函數首次調用時被定義,所以可以利用這個特點記錄函數被調用的次數:在函數體中定義static int count=0;
Count++;???????????? 靜態變量也默認初始化為0
l? 數組的初始化。定義的時候如何沒有同時對數組中任何一個元素賦初值,那么數組中每一個元素的值都是不確定的。注意這里的同時和任何。同時強調的是只能從頭開始連續賦值,任何強調的是其余未賦值的會初始化為0.
#include<stdio.h> #include<iostream> using namespace std; int main() {int i, j;cout << "Case:1" << endl;for (i = 0; i < 4; i++){for (j = 0; j <= i; j++)//小于等于怎么寫?{cout << "*";}cout << endl;}cout << "\n";cout << "Case:2" << endl;for (i = 0; i < 4; i++){for (j = 0; j < 4; j++){if (j >= i)cout << "*";elsecout << " ";}cout << endl;}cout << "\n";cout << "Case:3" << endl;for (i = 0; i < 4; i++){for (j = 0; j <=3+i; j++){if (j >=3- i)cout << "*";elsecout << " ";}cout << endl;}getchar();return 1; } ? #define _CRT_SECURE_NO_WARNINGS #include<stdio.h>int main() {char a[10], b[10];char c, d;scanf("%s", a);printf("a中保存的字符串為:%s\n", a);c = getchar();printf("c中保存的字符為:%c ", c);gets(b);printf("b中保存的字符串為:%s\n", b);d = getchar();printf("d中保存的字符為:%c", d);getchar();return 0; }
l? 上機考試總會有測試用例,測試用例都存放在文件中,這就需要從文件中讀取數據。
While(scanf(“%d%d”,&a,&b)!=EOF)
{
}
EOF實際是一個宏定義,等于-1,意思是End Of File。而scanf讀到文件尾也會返回-1.這時候才跳出循環。Scanf讀取數據成功時,會返回成功讀取的數據的個數
l? 在循環體中要想讀入數據顯示出來,有格式化輸入輸出函數scanf("<格式化字符串>", <地址表>);printf("<格式化字符串>",<參量表>);還有非格式化輸入輸出函數gets(字符數組名或指針);puts()。后者占用內存更小,且可以讀入空格,直到回車終止。Scanf遇到空格會停止,并在后面加終止符\0。puts()在輸出字符串時會將’\0’自動轉換成’\n’進行輸出,也就是說,puts方法輸出完字符串后會自動換行。
Scanf遇到空格、Tab、回車時自動加\0停止輸入,但之后的空格和回車仍然在緩沖區,會讀入到之后的getchar中。為了避免這個問題,可以在兩次輸入之間插入一個getchar()把這個回車符吃掉。或者在scanf的時候多寫一個%*c,讀取最后一個回車符,但是不把它賦予任何變量。
gets:可接受回車鍵之前輸入的所有字符,并用’\0’替代‘\n’.回車鍵不會留在輸入緩沖區中
https://blog.csdn.net/xingjiarong/article/details/47282817
scanf 函數報錯 error C4996: 'scanf',因為vs認為c標準函數不安全。可以依照提示添加一個宏定義https://blog.csdn.net/jh0703/article/details/47820875
l? Gets時不需要考慮EOF
Char str[10];
While(gets(str))
總結
- 上一篇: windows网络版象棋的实现
- 下一篇: 吴恩达作业6:梯度检验