怎样定义一个C语言的字符串?
比如:
char word[]={'H','e','l','l','o','!','\0'};
这个数组总共有7个单元,最后一个单元放的是 0,因为这个0使得这个word成为了C语言的一个字符串。
对于C语言来说,字符串是以0(整数0)结尾的一串字符(0或’\0’是一样的,但是和’0’不同)。
0标志字符串的结束,但它不是字符串的一部分。
两个相邻的字符串常量会被自动连接起来。
字符串以数组的形式存在,以数组或指针的形式访问,更多是以指针的形式访问。
string.h 里有很多处理字符串的函数。
又比如:
char line[10] = "Hello";
定义了一个长度为 10 的,叫做 line 的 char 类型数组。
“Hello” ----这样一个由双引号括起来的东西在C语言中叫做字符串常量, “Hello” 会被编译器变成一个字符数组放在某处,这个数组的长度是 6 ,因为结尾还有一个表示结束的 0 。
字符串变量
可以有以下几种表达形式:
char *str = "Hello";
char word[] = "Hello";
char line[10] = "Hello";
除了字面上的字符,编译器会替我们在结尾生成一个\0的。
总结:
当程序里需要一个字符串的时候,是写成指针形式还是数组形式呢?
如果要构造一个字符串,用数组;如果要处理一个字符串,用指针。
char*是不是字符串?
字符串的输入输出
安全的输入:
char string[8];
scanf("%7s", string);
在%和s之间的数字表示最多允许读入的字符的数量,这个数字应该比数组的大小小一。
空字符串:eg:
char buffer[100]=""; 这是一个空的字符串,buffer[0] == ‘\0’
char buffer[]=""; 这个数组的长度只有1。
字符串数组
程序参数
其实main()函数的参数表不是空的,是有参数的,即:
int main(int argc, char const *argv[])
第一个是整数,第二个是字符串数组。整数是用来说明数组中有多少字符串的。eg:(用来看输出什么的)
#include<stdio.h>
int main(int argc, char const *argv[])
{
int i;
for(i=0; i<argc; i++) //遍历数组
{
printf("%d:%s\n", i, argv[i]);
}
return 0;
}
输出为:
sunyuhang@666:~/c$ ./1
0:./1
sunyuhang@666:~/c$ ./1 123 asdf
0:./1
1:123
2:asdf
字符串函数(用到时再细看)
函数 | 目的 |
---|---|
strcpy(s1, s2); | 复制字符串 s2 到字符串 s1 |
strcat(s1, s2); | 连接字符串 s2 到字符串 s1 的末尾。 |
strlen(s1); | 返回字符串 s1 的长度 |
strcmp(s1, s2); | 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0 |
strchr(s1, ch); | 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置 |
strstr(s1, s2); | 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置 |
strcpy和strcat会由于目的地没有足够的空间,可能出现安全问题,建议尽量不要使用。
安全版本:
char *strncpy(char *restrict dst, const char *restrict src, size_t n); //n表示最多可以拷贝过去的字符数
char *strncat(char *restrict s1, const char *restrict s2, size_t n); //n表示最多可以连上的字符数
int strncmp(const char *s1, const char *s2, size_t n); //只判断前n个字符