指针和字符串之间的联系

0.常见误区

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

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

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

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

//此string1后面不会有'\0'标志,就是一般的字符数组
char string1[3]={'a','b','c'};

//string2为字符串形式,结尾有\0标志,长度为4
char string2[4]="abc"    

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

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

D:\otherworkspace\devcppworkspace\ds\ds-c2\demo5.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\t",string+i);    
         printf("%p\t",&string[i]);
         printf("%c\n",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\n", strlen(str));
    printf("with null character:    %zu\n", sizeof(str) );
    return 0; 
}

output

without null character: 45
with null character:    46
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值