C语言学习字符串

一、C语言一般是如何定义字符串的

char word[]={‘H’, ‘e’, ‘l’, ‘l’, ‘o’,‘!’,''};在结尾加一个0,才能正常定义这个字符串,而且在计算长度的时候需要将这个0也加上。


 

一般来说,C语言的字符串定义有以下注意点;

• 以0(整数0)结尾的⼀一串字符

• 0或’’是⼀一样的,但是和’0’不同

• 0标志字符串的结束,但它不是字符串的⼀一部分

• 计算字符串⻓长度的时候不包含这个0

• 字符串以数组的形式存在,以数组或指针的形式访问

• 更多的是以指针的形式

• string.h (标准库)里有很多处理字符串的函数

二、example

• char *str = “Hello”;有一个叫str的指针,它指向了一个字符数组,里面的内容是Hello

• char word[] = “Hello”;当前这里有一个字符数组,里面的内容是Hello

• char line[10] = “Hello”;有一个字符数组叫line,定义了它10个字节那么大的长度,里面放了Hello,一共有5个字符,需要占6个字节的空间(要算上结尾的0)

三、字符串常量

• “Hello”

• ″Hello″ 会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0

• 两个相邻的字符串常量会被自动连接起来


 

这里在第一个printf的时候,两个字符串用双引号括起来,中间没有其他符号,C语言会自动帮我们将他们连接起来

• 行末的表示下⼀一行还是这个字符串常量

• C语言的字符串是以字符数组的形态存在的

• 不能用运算符对字符串做运算

• 通过数组的方式可以遍历字符串

• 唯一特殊的地方是字符串字⾯面量可以用来初始化字符数组

• 以及标准库提供了一系列字符串函数

@注意点

char* s = "Hello, world!";

• s 是一个指针,初始化为指向一个字符串常量

• 由于这个常量所在的地⽅方,所以实际上s是 const char* s ,但是由于历史的原因,编译器接受不带const的写法

#include <stdio.h>
int main(void)
{
int i=0; //本地变量
char *s = "Hello world";
//s[0] = 'B';
char *s2 = "Hello world";
printf("&i=%p
",&i);
printf("s = %p
",s);
printf("s2 = %p
",s2);
printf("Here!s[0]=%c
",s[0]);
return 0;
}


 

• 但是试图对s所指的字符串做写⼊入会导致严重的后果

• 如果需要修改字符串,应该用数组:

char s[] = "Hello, world!";

四、指针还是数组?

• char *str = “Hello”;

• char word[] = “Hello”;

• 数组:这个字符串在这里

• 作为本地变量空间自动被回收

• 指针:这个字符串不知道在哪里

• 处理参数

• 动态分配空间


 


五、char*是字符串?

• 字符串可以表达为char*的形式

• char*不一定是字符串

• 本意是指向字符的指针,可能指向的是字符的数组(就像int*一样)

• 只有它所指的字符数组有结尾的0,才能说它所指的是字符串


六、字符串赋值

• char *t = “title”;

• char *s;

• s = t;

• 并没有产⽣生新的字符串,只是让指针s指向了t所指的字符串,对s的任何操作就是对t做的

七、字符串输入输出

• char string[8];

• scanf(“%s”, string);

• printf(“%s”, string);

• scanf读入一个单词(到空格、tab或回车为止)

• scanf是不安全的,因为不知道要读入的内容的长度

安全的输入

在%和s之间的数字表示最多允许读入的字符的数量,这个数字应该比数组的大小小一

#include <stdio.h>
int main()
{
char word[8];
char word2[8];
scanf("%7s",word);  //%s之前限制长度
scanf("%s",word2);//假如超过限定长度,会报abort trap:6,scanf数组越界
printf("%s##%s##
",word,word2);
return 0;
}

 

八、常见错误

• char *string;定义一个指针变量,

• scanf(“%s”, string);

• 以为char*是字符串类型,定义了一个字符串类型的变量string就可以直接使用了

• 由于没有对string初始化为0,所以不一定每次运行都出错

九、空字符串

• char buffer[100]=””;

• 这是一个空的字符串,buffer[0] == ‘’

• char buffer[] = “”;

• 这个数组的长度只有1!只有buffer[0]

十、字符串数组

• char **a

• a是一个指针,指向另一个指针,那个指针指向一个字符(串)

• char a[][]

• a是一个二维数组,第二个维度的大小不知道,不能编译通过

• char a[][10]

• a是一个二维数组,a[x]是一个char[10],长度为10,a[0],10个字符

• char *a[]

• a是一个一维数组,a[x]是一个char*,a[0]是一个指针,指向外面其他的内容

#include <stdio.h>
int main(void)
{
     char * str[] = {'0',"January","February",
     "March","April","May",
     "June","July","August","September",
     "October","November","December",""};  //指针数组,每个指针指向一个字符串常量 
     printf("请输入月份: ");
     int month;
     scanf("%d",&month);
     printf("%s",str[month]);
     return 0;
     
 } 

十一、程序参数

• int main(int argc, char const *argv[])

• argv[0]是命令本身

• 当使用Unix的符号链接时,反映符号链接的名字

原文地址:https://www.cnblogs.com/guoweilf/p/11474992.html