zoukankan      html  css  js  c++  java
  • 指针和字符串之间的联系

    0.常见误区

    1. c语言中没有string基本数据类型

      C语言里有<string.h>这个头文件,所以就想当然的认为C语言里有string这个类型,通过下面这种形式来声明string的变量 string aString; 编译失败。原来C语言里压根就没有string这个类型,所以字符串都是通过char数组来存储的, 而<string.h>这个头文件里声明的函数原型也全是针对char数组的种种操作。直到C++中才出现了string这个类(注意是类, 不是类型)。

    2. 字符串通过字符数组来定义时,默认会在数组最后一个元素加上''作为结束标志

    3. 鉴于第二点,如果要区分普通的字符数组和字符串,参考如下代码

    //此string1后面不会有''标志,就是一般的字符数组
    char string1[3]={'a','b','c'};
    
    //string2为字符串形式,结尾有标志,长度为4
    char string2[4]="abc"    
    

    注意:这里的string2的长度可以不限定,默认省略,交给编译器自动设定长度,如果需要人为设定长度,则需要考虑到''字符

    如果字符数组长度不够,则编译器报错

    D:otherworkspacedevcppworkspacedsds-c2demo5.cpp [Error] initializer-string for array of chars is too long [-fpermissive]

    1. 数组名字和指针的关系

      示例代码如下:

      #include<stdio.h>
      
      int main(){
      	int i;
      	char string[]="abc";
      	for(i = 0;i<4;i++){
      		printf("%p	",string+i);	
      		printf("%p	",&string[i]);
      		printf("%c
      ",string[i]);
      	}
      	return 0;
      } 
      

      打印结果

      000000000062FE10        000000000062FE10        a
      000000000062FE11        000000000062FE11        b
      000000000062FE12        000000000062FE12        c
      000000000062FE13        000000000062FE13
      

      根据代码的运行结果来看,string【也就是数组名字】其实就是一个指针,它指向了第1个元素【下标为0】,我们可以直接对指针进行算数运算,它会自动的根据指针类型移动相应的长度,比如说这里的指针就是字符型,占一个字节,那么string++,就会自动把指针往后移动一个字节。

    1.0 字符串的读取

    #include <stdio.h>
    int main()
    {
        char name[20];
        printf("Enter name: ");
        scanf("%s", name);
        printf("Your name is %s.", name);
        return 0;
    }
    

    运行结果:

    Enter name: Dennis Ritchie
    Your name is Dennis.
    

    scanf()函数读取字符序列,当遇到空格(space,newline,tab etc.)时停止读取。

    那么如何读取行呢?

    #include <stdio.h>
    int main()
    {
        char name[30];
        printf("Enter name: ");
        fgets(name, sizeof(name), stdin);  // read string
        printf("Name: ");
        puts(name);    // display string
        return 0;
    }
    

    输出

    Enter name: Tom Hanks
    Name: Tom Hanks
    

    在这里,我们使用了fgets()函数从终端读取字符串。 fgets(name,sizeof(name),stdin); sizeof(name)的结果为30。因此,我们最多可以输入30个字符作为输入,即name字符串的大小,也可以指定为其它的长度。 为了打印字符串,我们使用了puts(name),你也可以直接使用printf()函数打印。

    注意:gets()函数也可以接受用户的输入。但是,它已从C标准中删除。 这是因为gets()允许输入任意长度的字符。因此,可能存在缓冲区溢出。

    1.1字符串长度的获取

    示例代码

    //求字符串长度 
    #include <string.h>
    #include <stdio.h>
     
    int main(void)
    {
        const char str[] = "How many characters does this string contain?";
     
        printf("without null character: %zu
    ", strlen(str));
        printf("with null character:    %zu
    ", sizeof(str) );
        return 0; 
    }
    

    output

    without null character: 45
    with null character:    46
    
  • 相关阅读:
    SpringBoot集成springfox-swagger2访问swagger-ui.html页面弹窗提示问题
    Java数据结构与算法之队列(Queue)实现
    华为S9300交换机热补丁安装
    ubnt EdgeSwitch 24-Port 250W DHCP_CLI[osapiTimer]: dhcp_prot.c(812) 1285780 %% Failed to acquire an IP address on Network Port; DHCP Server did not respond.
    windows server 2012 r2查看远程用户登录IP
    iptables && firewall 的简单应用
    deepin如何自定义启动器图标,如firefox
    deepin如何访问samba共享文件夹
    vsftpd服务搭建
    华为服务器RH 2288H v2 or v3安装系统
  • 原文地址:https://www.cnblogs.com/ericling/p/11761031.html
Copyright © 2011-2022 走看看