C语言中字符串和字符数组

字符串概念: 
C语言中字符串就是用双引号括起来的任意字符序列,在字符串中同时也可以包括转义字符,它是以’\0’为结尾的字符数组 
如”helloworld”; 
char *string = “helloworld”; 
字符数组: 
用来存放字符的数组,字符数组中每个元素存放一个字符,数组元素的类型为char类型,初始化字符数组的时候最好以’\0’结尾, 
‘\0’是结束符号 
如:char string []= “helloworld”; 
char array [] = {‘h’,’e’,’l’,’l’,’o’,’w’,’o’,’r’,’l’,’d’,’\0’}; 
char array [] = {“helloworld”};

注意:使用字符串初始化字符数组的时候,它比用字符逐个赋值要多占用一个字节,用于存放’\0’,同时字符数组的长度不会去计算’\0’,但是数组占有的字节数会将’\0’算上,是由系统自行来进行处理的

字符数组的输入输出: 
注意:输出的时候只要是遇到’\0’符号的时候,就会停止输出 
1. 通过循环来将字符数组逐个输入输出 
2. 将整个字符串一次性进行输出或输入,C语言允许用数组名进行输入一个字符数组,如:

        char a[10];
        scanf("%s",a);
        char b []  = "girl";
        printf("%s",b);
  • 1
  • 2
  • 3
  • 4
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char global_array[5];//全局变量会初始化
int main(int argc,char *argv[]){
    char local_array[5];//局部变量是不会进行初始化的
    char array1[] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};
    char array2[] = "hello world";
    char array3[] = {"hello world"};

    char array4[5] = "helloworld";  
    char array5[20] = "helloworld";

    //char  array[6] = {'\0'};初始化类型
    //char array6[10];
    //memset(array6,0,sizeof(array6));//使用memset来对字符数组进行初始化

    //字节的长度比字符串的长度要多1
    printf("array1:%s sizeof array1:%d,strlen array1:%d\n",array1,sizeof(array1),strlen(array1));
    printf("array2:%s sizeof array2:%d,strlen array2:%d\n",array2,sizeof(array2),strlen(array2));
    printf("array3:%s sizeof array3:%d,strlen array3:%d\n",array3,sizeof(array3),strlen(array3));
    printf("array4:%s sizeof array4:%d,strlen array4:%d\n",array4,sizeof(array4),strlen(array4));
    printf("array5:%s sizeof array5:%d,strlen array5:%d\n",array5,sizeof(array5),strlen(array5));

    char array6[10];
    memset(array6,0,sizeof(array6));//使用memset来对字符数组进行初始化,也可以用来对内存进行初始化
    printf("input a string:\n");//尽量不要数组越界,因为在C 语言中,数组超出其操作内存的范围,不会判错,但是这种是及其不安全的,因为操作的内存很
有可能是其他函数操作的内存
    //scanf("%s",array6);使用scanf读取内容,但是其是不会判断字符串的长度的

    //fgets可以从文件读取,也可以从标准输入进行读取,使用stdin,使用fgets读取字符串的时候,只能读取字符(数组长度-1)个字符,解决了scanf的问题,同时
也解决了输入空格的问题。
    fgets(array6,sizeof(array6),stdin);
    printf("%s\n",array6);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

输出结果为: 
array1:hello world sizeof array1:12,strlen array1:11 
array2:hello world sizeof array2:12,strlen array2:11 
array3:hello world sizeof array3:12,strlen array3:11 
array4:hello sizeof array4:5,strlen array4:5 
array5:helloworld sizeof array5:20,strlen array5:10

从上面的array4和array5我们可以看出,如果制定数组的长度,那么此时我们输出的字符串是按照数组的长度来进行输出的 
1:如果数组长度大于字符串的长度的时候 ,这个时候,输出是完整的,数组长度为定义的长度,字符串长度是数组中字符的长度 
2:如果数组长度小于字符串长度的时候,输出是不完整的 ,数组长度这个时候是定义的长度,处处的字符长度也为定义的长度,字符串的长度同样也是定义的长度

实战注意: 
尽量不要对字符数组长度进行定义,应该把这个长度交给系统来进行分配 
一般情况下使用memset来对内存进行初始化 
一般情况下我们使用fgets来进行字符数组的初始化,而不用scanf,因为fgets很好的解决了输入越界的问题以及数组的空格问题

下面这个案例就是通过字符数组来计算一句话中单词的平均长度;

#include<stdio.h>
#include<string.h>


int main(void)
{
    int letter = 0;
    int word_count = 0;
    int flag = 0;
    char array[30] = {'\0'};
    printf("Please input a sentence!\n");
    fgets(array,sizeof(array),stdin);
    int n = strlen(array);
    int i = 0;
    for(i = 0 ; i< n ; i++){
        char  ch  = array[i];
        if(ch == '\n')
            break;
        if(ch == ' '|| ch =='\t'){
            flag = 0;
        }else if(!flag && ch != ' '  && ch != '\t'){
            word_count ++ ;
            flag = 1;
        }
        if(ch != ' '&& ch!='\t'){
            letter++;
        }
    }   
    printf("Average word length:%.1f\n",(float)letter/word_count);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

代码是可以直接进行run的,欢迎大家之处不足之处,在这里就不进行运行了

猜你喜欢

转载自blog.csdn.net/houyichaochao/article/details/80755056