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"
数组名字和指针的关系
示例代码如下:
#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()函数打印。
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