1. 程式人生 > 實用技巧 >字串與字元陣列

字串與字元陣列

字串與字元陣列

  • 字元陣列定義

    char array[100];
    
  • 字元陣列初始化

    char array[100]={'a','b','c','d'};
    char array[100]="abcd";
    char array[100]={0};
    char array[]="abcd";
    
  • 隨機數產生函式rand與srand

    • 標頭檔案stdlib.h

    • rand是偽隨機數產生器,每次呼叫rand產生的隨機數都是一樣的

    • 如果呼叫rand之前先呼叫srand就出現任意的隨機數

    • 只要能保證每次呼叫srand函式的時候,引數的值是不同的,那麼rand函式就一定會產生不同的隨機數

      #include <time.h>
      int main(){
      	int t = (int)time(NULL);
      	srand(t);
      	for (int i = 0; i < 10; i++)
      	{
      		printf("%d\n", rand());
      	}
      }
              
      
  • 用scanf輸入字串

#include <stdio.h>

int main(){
    
    char s[10]={0};
    scanf("%s",s);//"%s"的作用就是輸入一個字串的,scanf是以回車鍵作為輸入完成標示的,但回車鍵本身並不會作為字串的一部分
	//如果scanf引數中的陣列長度小於使用者在鍵盤輸入的長度,那麼scanf就會緩衝區溢位,導致程式崩潰
    int i;
    for(i=0;i<10;i++){
        printf("%d\n",s[i]);
    }
    printf("----------------------------------\n");	
    printf("%s\n", s);
	return 0;
}
  • 字串的結束標誌
    scanf將回車,空格都認為是字串輸入結束標誌.

  • 字串處理函式

    • gets

      #include <stdio.h>
      int main(){
          char s[100]={0};
          gets(s);//gets認為回車的輸入結束標示,空格不是輸入結束標示,所以用gets這個函式就可以實現輸入帶空格的字串
      	//gets和scanf一樣存在緩衝區溢位的問題
          
          int i;
          for(i=0;i<10;i++){
              printf("%d\n",s[i]);
          }
          printf("----------------\n");
          printf("%s\n",s);
      }
      //gets不能用類似'%s'或者'%d'之類的字元轉義,只能接受字串的輸入
      
  • fgets函式

    /*gets函式不檢查預留緩衝區是否能夠容納使用者實際輸入的資料。多出來的字元會導致記憶體溢位,fgets函式改進了這個問題。
    由於fgets函式是為讀取檔案設計的,所以讀取鍵盤時沒有gets那麼方便*/
    
    char s[100]={0};
    fgets(s,sizeof(s),stdin);
    

    stdin是標準輸入,一般指鍵盤輸入到緩衝區裡的東西。

  • puts

    //puts函式列印字串,與printf不同,puts會在最後自動新增一個'\n'
    char s[]="老龍很帥,在座的各位都很醜!!!";
    puts(s);
    
  • fputs函式

    //fputs是puts的檔案操作版本
    char s[]="老龍很帥,在座的各位都很醜!!!";
    fputs(s,stdout); //stdout標準的輸出
    
  • strlen,字串長度

    //size_t strlen(const char* _Str); 返回不包含字串結尾'\0'的字串長度
    char s[100]="老龍很帥,在座的各位都很醜!!!";
    int len=strlen(s);//得到字串長度,返回一個字串中有效字元的數量(不包含字串結尾的0)
    printf("%d\n",len);
    
    //自定義strlen函式實現
    int _strlen(const char* _str){
        int len=0;//計算_str長度
        if(_str!=NULL){
            while((*_str++)!='\0')
                len++;
        }
        return len;
    }
    
  • strcat,字串追加

    //size_t strcat(char* _str1,const char* _str2) 將引數_str2追加到_str1後尾
    char s[128]="Hello World!";
    int len=strlen(s);//計算s字串長度,返回一個字串中的有效字元數量(不包含字串結尾的0)
    printf("len=%d\n",len);
    char s1[100]="abc123321";
    strcar(s,s1);//將兩個字串合併,結果放入第一個引數裡面,strcat也存在緩衝區溢位的問題
    printf("%s\n", s);
    
    //自定義strcat函式實現
    void _strcat(char* _str1,const char* _str2){
        if(_str1!=NULL&&_str2!=NULL){
            while(*_str1!='\0')
                _str1++; //迴圈至str1字串末尾
            while(*_str2!='\0')
              *_str1++=*_str2++; //把字串_str2裡面的內容儲存至_str1中
            *_str1='\0';//結尾str1賦值'\0'表示字串結束
        }
    }
    
  • strncat,字串有限追加

    //size_t strncat(char* _str1,const char* _str2,size_t len)
    	char s[128] = "老龍很帥";
    	char s1[50] = ",在座的各位都很醜!!!";
    
    	strncat(s, s1, 5);
    	printf("%s\n", s);
    
    //自定義strncat函式實現
    void _strncat(char* _str1, const char* _str2, size_t len){
    	if (_str1 != NULL&&_str2 != NULL){
    		while (*_str1 != '\0')_str1++;
    		for (int i = 0; i < len; i++){
    			*_str1++ = *_str2++;
    		}
    	}
    }
    
  • strcmp,字串比較

    //int strcmp(const char* _str1,const char* _str2);
    //比較兩個字串是否相等,相等返回0,不等返回非0
    	char s[128] = "aabc"; //>大於-1  等於0 小於1
    	char s1[50] = "aabcs";
    
    	printf("%d\n", strcmp(s, s1));
    
    //自定義strcmp函式實現
    int _strcmp(const char* str1,const char* str2){
    	int ret = 0;
    	if (str1 != NULL&&str2 != NULL){
    		while (!(ret = *str1 - *str2) && *str1){
    			str1++;
    			str2++;
    		}
    	}
    
    	if (ret > 0)
    		return 1;
    	else if (ret < 0)
    		return -1;
    
    	return 0;
    }
    
  • strncmp,字串有限比較

    int strcmp(const char* _str1,const char* _str2,size_t len);
    
  • strcpy字串拷貝

    char *strcpy(char * _Str1, const char * _Str2);
    //將引數_Str2拷貝到引數_Str1中
    
    //自定義strcpy函式實現
    void _strcpy(char* _str1,const char* _str2){
        if(_str1!=NULL&&_str2!=NULL){
         	while((*_str1++=*_str2++)!='\0')
        }    
    }
    
  • strncpy字串有限拷貝

  • sprintf,格式化字串
    和printf函式功能類似,printf函式將格式化結果輸出到螢幕,sprintf將格式化結果輸出到字串

  • sscanf函式
    sscanf類似於scanf函式,,scanf從鍵盤讀取使用者輸入,scanf從指定格式化字串讀取輸入

    	char s[128] = "10 0x10 aabc";
    	int x,y;
    	char b[100];
    	sscanf(s, "%d %X %[a-z]", &x,&y,b);
    	printf("%d\n",x);
    	printf("%x\n", y);
    	printf("%s\n",b);
    
  • strchr查詢字元

    char * strchr(char * _Str, int _Ch);
    //在引數_str中查詢引數_Ch指定字元,找到返回字元_Ch在_Str中所在位置,沒有找到返回NULL;
    
    //自定義strchr函式實現
    char *strchr(const char* _str1,int ch){
    	if (str1 != NULL){
    		while (*_str1++ != '\0'){
    			if (*_str1 == ch){
    				return (char*)_str1;
    			}
    		}
    	}
    	return NULL;
    }
    
  • strstr

    char* strstr(char* _str,const char* _substr)
    //在引數_str中查詢引數_substr指定子串,找到返回子串在_str中所在位置,沒有找到返回NULL
    
    //自定義strstr函式實現
    char* _strstr(char* _str, const char* _substr){
    	if (_str != NULL&&_substr != NULL){
    		int lenstr = strlen(_str);
    		int lensub = strlen(_substr);
    		if (lenstr < lensub)
    			return NULL;
    		int i, j;
    		for (i = 0; i < lenstr - lensub; i++){
    			for (j = 0; j < lensub; j++){
    				if (_str[i + j] != _substr[j])
    					break;
    			}
    			if (j == lensub)
    				return &_str[i];
    		}
    	}
    	return NULL;
    }
    
  • strtok分割字串

    //字元在第一次呼叫時strtok()必需給予引數s字串,往後的呼叫則將引數s設定成NULL每次呼叫成功則返回指向被分割出片段的指標
    	char buf[] = "abc@defg@igk";
    	char *p = strtok(buf, "@");
    	while (p)
    	{
    		printf("%s\n", p);
    		p = strtok(NULL, "@");
    	}
    
  • atoi轉化為int atof轉化為float atol轉化為long
    需要包含標頭檔案stdlib.h