1-字符型



    在各种不同系统中,字符类型都占一个字节(8位)。定义如下:

也可以用字符对应的ASCII码赋值,如下:

  char c=97;

     char c='good';得到的是最后一个字符 即'd'

     C语言是ASCII码的形式存储字符型变量的,存储形式与整数类似,所以字符型和整数(范围0-255)之间可以通用。



2-字符串



 



     II-长度(占用内存字节)

     在实际应用中人们关心的是有效字符串的长度而不是字符数组的长度,C语言规定了一个“字符串结束标志”,以字符'\0'代表。如果有一个字符串,其中第10个字符为'\0',则此字符串的有效字符为9个。也就是说,在遇到第一个字符'\0'时,表示字符串结束,由它前面的字符组成字符串。
系统对字符串常量也自动加一个'\0'作为结束符。例如"C Program”共有9个字符,但在内存中占10个字节,最后一个字节'\0'是系统自动加上的。(通过sizeof()函数可验证)  


char two[]="abcd"; 
  
 
  

       cout<<sizeof(two);   //输出为5 
  
 
 
   strlen 函数原型为:
 
 
int mystrlen(const char *str){
 
 

       //assert(str); 
 
 
 

       const char *p=str; 
 
 
 

       while(*p++ != NULL); // or !='\0' 
 
 
 

       return p-str-1; 
 
 
 

   }


3-strlen 和sizeof区别




strlen(char*)函数求的是字符串的实际长度,它求的方法是从开始到遇到第一个'\0', 如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。



char aa[10];cout<<strlen(aa)<<endl; //结果是不定的



char aa[10]={'\0abc'}; cout<<strlen(aa)<<endl; //结果为0



char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3



而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。



sizeof(aa) 返回10



int a[10]; sizeof(a) 返回40 



⒈sizeof操作符的结果类型是 size_t,它在头文件中typedef为unsigned int类型。 该类型保证能容纳实现所建立的最大对象的字节大小。



⒉sizeof是操作符(关键字),strlen是函数。



⒊sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。



⒋数组做sizeof的参数不退化,传递给strlen就退化为 指针了。




 4-两种初始化的长度对比


#include <stdio.h> 
  
 
  

    #include <string.h> 
  
 
  

     int  main() 
   
 
   

     { 
   
 
   

         char c1[]={'I',' ','a','m',' ','h','a','p','p','y'}; 
   
 
   

         char c2[]="I am happy"; 
   
 
   

         int i1=sizeof(c1); 
   
 
   

         int i2=sizeof(c2); 
   
 
   

         char str1[20]="12345"; 
   
 
   

         printf("size c1:%d\n", i1);//10 
   
 
   

         printf("size c2:%d\n", i2);//11 
   
 
   

         printf("length:%d\n",strlen(c2));//10 
   
 
   
 
    
 
   

         printf("%d %d\n",sizeof(str1),strlen(str1));//20 5 
   
 
   

         return 0; 
   
 
   
 
    
 
   

     }


5-字符串的表示形式




在C语言中,可以用两种方法表示和存放字符串:
(1)用字符数组存放一个字符串
          char str[ ]="I love China";
(2)用字符指针指向一个字符串
          char* str="I love China";

C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时只是把字符串首地址(即存放字符串的字符数组的首地址)赋给str。


int  main(){ 
  
char* a ="helko"; 
  
char* s[]={"how","are","you"}; 
  
int lenthS=0; 
  
char ss[100]="\0abcd"; 
  
 
  
printf("a[2]=%c\n",*(a+2));//a[2]=l 
  
printf("%s\n",a+1);//elko 
  
lenthS = sizeof(s)/sizeof(char*); 
  
printf("lenthS=%d\n",lenthS);//3 
  
         printf("%s\n",*(s+1));//are 
  
printf("lenth of SS:%d\n",strlen(ss));//0 
  
return 0; 
  
 }

6-字符串gets  和 scanf()的区别


scanf( )函数和gets( )函数都可用于输入字符串,gets可以接收空格;而scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格。


char string[15]; 

gets(string); /*遇到回车认为输入结束*/

scanf("%s",string); /*遇到空格认为输入结束*/

所以在输入的字符串中包含空格时,应该使用gets输入;


strlwr()函数:将字符串中的大写字母换成小写字母。


strupr()函数:将字符串中的小写字母换成大写字母。


注:此函数是直接对原字符串进行操作,字符串的值会改变;

int main(){ 
 
char a[]="zbc"; 
 
char b[]="ASD"; 
 
printf("before:%s\n",a); 
 
printf("Uper:%s  Lower:%s\n",strupr(a),strlwr(b)); 
 
printf("after;%s\n",a); 
 
return 0; 
 
 }




aes解密常量字符串过长问题_bc