字元串輸入輸出:
char str[8];
scanf("%s",&str);
printf("%s",str);
scanf表示讀入一個單詞(到空格、tab、回車為止)
scanf是不安全的,因為這樣不知道要讀入的内容的長度,在一些情況中會出現問題:
#include<stdio.h>
void f(){
char s1[8];
char s2[8];
scanf("%s",&s1);
scanf("%s",&s2);
printf("s1 = %s\ns2 = %s",s1,s2);
}
int main(){
f();
return 0;
}
理論上,輸入超過8的字元串會報錯
(翁恺的視訊中會報錯,但我自己用dev-c++就不會出現這類問題……)
安全的方法:
建議對字元串輸入時,限制其輸入長度,如:
scanf("%6s",&s1);
限制我輸入的字元串輸入長度最長為6,如果有結束标志(TAB、空格、回車)同樣會直接結束,結果會為:
1234567654 345
s1 = 123456
s2 = 7654
12345 234565432
s1 = 12345
s2 = 234565432
空字元串:
char buffer[100] = "";
這是一個空字元串,此時buffer[0] == ‘\0’
char buffer[] = "";
如此定義的話,buffer的長度是1,不能起到建立一個空字元串的作用
字元串數組:
可能會有兩種猜想字元串數組的定義:
char **a;
a是一個指針,指向另一個指針,這個(另一個指針)指向一個字元(串),是以這并不是想要的字元串數組
char a[][];
這是一個二維數組,講道理應該是字元串數組的樣子,但實際上它對長度非常有限制:
#include<stdio.h>
void f(){
char a[][] = {
"Hello",
"hahah"
};
}
int main(){
f();
return 0;
}
首先,會報錯,因為列必須要有一個确定的數字
char a[][] 改成char a[][10]後,成功執行,但是這時候我們定義的行長度為固定的,就像是const char a[] = “Hello”,固定為6(有一個\0),是以如果将這裡面的元素改成
char a[][] = {
"Hello",
"hahahaha"
};
系統會報錯
(翁恺的編譯器會出問題,我用的并不會……但出于安全考慮,不建議這樣定義字元串數組)
在此提供一個正确的寫法:
char *a[];
此時将其替換後便是最安全的字元串數組定義方法
char a[][10] 和 char *a[]的差別:
char a[][10]是開辟了一個n行10列的矩陣,然後每行存有資料,如下圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPnVmNoRVTwkFVOJTRywEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcuIjM3IzNyIjMzATMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
char *a[]可以了解為指針數組,a[0]指向一個字元串(如“hello\0”),a[1]指向另一個字元串(如“li\0”),如下圖:
是以這兩個是不等值的,出于安全考慮,建議使用後者
程式參數
預設的main函數是
int main(int argc,char const *argv[])
argc是指後面數組的大小(size)
argv[0]是指令本身,當使用unix的符号連結時,會反映符号連結的名字
對于這個字元串,可以通過代碼呈現出來:
#include<stdio.h>
int main(int argc, char const *argv[]){
int i;
for(i = 0;i<argc;i++){
printf("%d:%s\n",i,argv[i]);
}
return 0;
}
後續内容建議看視訊,需要linux系統,windows不好實作
翁恺 程式設計入門 程式參數