字符串概念:
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语言允许用数组名进行输入一个字符数组,如:

    1. char a[10];
    2. scanf("%s",a);
    3. char b [] = "girl";
    4. printf("%s",b);

include
#include
#include

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”};

  1. char array4[5] = "helloworld";
  2. char array5[20] = "helloworld";
  3. //char array[6] = {'\0'};初始化类型
  4. //char array6[10];
  5. //memset(array6,0,sizeof(array6));//使用memset来对字符数组进行初始化
  6. //字节的长度比字符串的长度要多1
  7. printf("array1:%s sizeof array1:%d,strlen array1:%d\n",array1,sizeof(array1),strlen(array1));
  8. printf("array2:%s sizeof array2:%d,strlen array2:%d\n",array2,sizeof(array2),strlen(array2));
  9. printf("array3:%s sizeof array3:%d,strlen array3:%d\n",array3,sizeof(array3),strlen(array3));
  10. printf("array4:%s sizeof array4:%d,strlen array4:%d\n",array4,sizeof(array4),strlen(array4));
  11. printf("array5:%s sizeof array5:%d,strlen array5:%d\n",array5,sizeof(array5),strlen(array5));
  12. char array6[10];
  13. memset(array6,0,sizeof(array6));//使用memset来对字符数组进行初始化,也可以用来对内存进行初始化
  14. printf("input a string:\n");//尽量不要数组越界,因为在C 语言中,数组超出其操作内存的范围,不会判错,但是这种是及其不安全的,因为操作的内存很

有可能是其他函数操作的内存
//scanf(“%s”,array6);使用scanf读取内容,但是其是不会判断字符串的长度的

  1. //fgets可以从文件读取,也可以从标准输入进行读取,使用stdin,使用fgets读取字符串的时候,只能读取字符(数组长度-1)个字符,解决了scanf的问题,同时

也解决了输入空格的问题。
fgets(array6,sizeof(array6),stdin);
printf(“%s\n”,array6);
return 0;
}
输出结果为:
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
#include

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;
}