字符型数据(字符常量和字符串常量)使用及区别

来源:互联网 发布:java 闰年 编辑:程序博客网 时间:2024/06/05 12:46

1-字符型

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

  char c='a';//C 语言中,使用单引号把字符引起来构成字符常量,双引号"abc"是字符串常量也可以用字符对应的ASCII码赋值,如下:

  char c=97;

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

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

2-字符串

   I -在c语言中,将字符串作为字符数组来处理。(c++中不是)

     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输入;

7-字符串转换函数
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;
}


0 0
原创粉丝点击