C語言程式設計 學習筆記 字串(II)(字串輸入輸出,字串陣列,程式引數)
字串輸入輸出:
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列的矩陣,然後每行存有資料,如下圖:
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不好實現
翁愷 程式設計入門 程式引數