天天看點

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列的矩陣,然後每行存有資料,如下圖:

C語言程式設計 學習筆記 字元串(II)(字元串輸入輸出,字元串數組,程式參數)

char *a[]可以了解為指針數組,a[0]指向一個字元串(如“hello\0”),a[1]指向另一個字元串(如“li\0”),如下圖:

C語言程式設計 學習筆記 字元串(II)(字元串輸入輸出,字元串數組,程式參數)

是以這兩個是不等值的,出于安全考慮,建議使用後者

程式參數

預設的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不好實作

翁恺 程式設計入門 程式參數

繼續閱讀