C语言基础--数组( 二 )

  • 字符串一定是一个char的数组,但是char数组未必是字符串 。
  • 数组0(和字符串‘\0’等价)结尾的char数组就是一个字符串,但是如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通数组,所以字符串是一种特殊的char数组 。
  • #include<stdio.h>int main(){ char c[] = {'a','b','c'};//普通的字符数组 printf("%s\n", c);//乱码,因为没有'\0'结尾,用%s打印出错 //有'\0'结尾的字符数组就是字符串 char c1[] = { 'a','b','c','\0'}; printf("%s\n", c1); char c2[]= { 'a','b','c','\0' ,'d','e','f'}; printf("%s\n", c2);// \0后面的部分不会被打印 return 0;}运行结果如下:
    C语言基础--数组

    文章插图
    打印字符串的时候遇到'\0'就停止打印,字符数组含有'\0'就是字符串 。
    注意:char c[] = "hello",用" "括起来的就是字符串,此时编译器会自动在后面加上\0,在内部其实是这样的额char c[] = {'h','e','l','l','o','\0'} 。
    scanf和getsscanf 遇到空格结束,遇到\n结束,所以用scanf这种方式并不是很好,有时候想要读取一个hello world遇到空格结束,只能读取到hello 。
    • gets(str)允许输入的字符串有空格
    • scanf不允许含有空格
    • 但是scanf和gets都有一个很致命的缺点,就是如果存放读取字符的空间不足,会自动向后存储,会造成内存污染,假设给定的字符空间是num[5]大小是5,但是如果输入的字符大小超过5,依旧会存储,此时会自动覆盖后面空间的内容,会造成内存污染
    fgets
    C语言基础--数组

    文章插图
    示例:
    #include<stdio.h>int main(){ char buf[5] = ""; fgets(buf, sizeof(buf), stdin); printf("%s\n", buf); return 0;}运行结果如下:
    C语言基础--数组

    文章插图
    fgets会把回车键\n读取,但是scanf和gets遇到\n会结束读取 。
    有一种情况,定义了一个数组char a[3];,输入的时候输入的是a+回车,那么此时用fgets获取char数组内的内容就是a[3] = {'a','回车','\0'};
    如何去掉\n?
    只需要将\n替换成\0
    示例:
    char buf[128] = "helloA";//buf[5]=0;int i=0;while(buf[i]!='\0'){ i++;}buf[i-1] = '\0';printf("%s\n",buf);strlen【C语言基础--数组】size_tnstrlen(const chars);
    功能:计算指定指定字符串s的长度,不包含字符串结束符‘\0’
    参数:s:字符串首地址
    返回值:字符串s的长度,size_t为unsigned int类型
    fgets相对于scanf和gets不会污染内存(安全),但是fgets会读取\n,所以只需要将\n去掉就可以了 。
    字符数组输出函数printfchar buf[1024] = "hello world";printf("%s\n",buf)打印字符串的时候遇到'\0'就停止打印 。
    puts*

    经验总结扩展阅读