1. 程式人生 > >C語言程式設計 學習筆記 字串(II)(字串輸入輸出,字串陣列,程式引數)

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不好實現
翁愷 程式設計入門 程式引數