0. 常见误区
c 语言中没有 string 基本数据类型
C 语言里有 < string.h > 这个头文件, 所以就想当然的认为 C 语言里有 string 这个类型, 通过下面这种形式来声明 string 的变量 string aString; 编译失败. 原来 C 语言里压根就没有 string 这个类型, 所以字符串都是通过 char 数组来存储的, 而 < string.h > 这个头文件里声明的函数原型也全是针对 char 数组的种种操作. 直到 C++ 中才出现了 string 这个类(注意是类, 不是类型).
字符串通过字符数组来定义时, 默认会在数组最后一个元素加上'\0'作为结束标志
鉴于第二点, 如果要区分普通的字符数组和字符串, 参考如下代码
- // 此 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]
数组名字和指针的关系
示例代码如下:
- #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
来源: https://www.cnblogs.com/ericling/p/11761031.html