一、什么是字符串
字符串是一个或多个字符的序列,它使用一对双引号包裹起来,以 '\0' 作为字符串的结束标志。在 C语言 中,我们可以使用 字符数组 来保存字符串,也就是使用一个一维字符数组保存字符串中的每一个字符。此时,编译器会自动为其添加 '\0' 作为结束符。
char array[] = "hello world";
我们也可以使用字符指针的方式来定义字符串;C语言 对字符串常量是按字符数组处理的,在内存中开辟了一个字节数组用来存放字符串常量,程序在定义字符串指针变量时只是把字符串首地址(即存放字符串的字节数组的首地址)赋给指针变量。
char *str = "hello world";
字符数组是若干个元素组成的,每个元素放一个字符,而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中。对字符数组除了定义时可以使用字符串整体赋值,其它情况下只能单个元素赋值。对字符指针可以使用字符串整体赋值;
如果定义了一个字符数组,那么它有确定的内存地址(即字符数组名是一个常量),而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。
程序中往往依靠检测 '\0' 的位置来判断字符串是否结束,而不是根据数组的长度来决定字符串长度。因此,字符串长度不会统计 '\0' ,字符数组长度会统计;
在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度,否则,在输出字符数组时可能出现未知字符;
系统对字符串常量也会自动添加一个 '\0' 作为结束符;
定义字符数组时,如果给的字符个数比数组的长度小,则系统会默认将剩余的元素空间,全部设置为 '\0';
二、字符串的输入输出
我们可以使用格式符 "%c" 实现字符数组中字符的输出。
#include <stdio.h>
int main()
{
char array[] = "hello world!";
int i = 0;
while(array[i])
{
printf("%c",array[i]);
i++;
}
return 0;
}
还可以使用格式符 "%s" 进行输入和输出。
#include <stdio.h>
int main()
{
char array[15];
int i = 0;
printf("请输入一个字符串:\n");
scanf("%14s",array);
// 通过正则表达式,获取带空格字符串
//scanf("%[^\n]",array);
printf("你输入的字符串为:\n");
printf("%s\n",array);
return 0;
}
由于 scanf() 函数无法知道要输入字符串的大小,必须遇到换行符或读到文件结尾位置才接收输入,因此容易导致字符数组越界的情况。
我们还可以通过 gets() 函数输入字符串,puts() 函数输出字符串。由于 gets() 函数无法知道要输入字符串的大小,必须遇到换行符或读到文件结尾位置才接收输入,因此容易导致字符数组越界的情况。gets() 函数接收字符串可以带空格;puts() 函数自带换行。
#include <stdio.h>
int main()
{
char array[15];
printf("请输入字符串:\n");
gets(array);
printf("你输入的字符串为:\n");
puts(array);
return 0;
}
我们还可以通过 fgets() 函数输入字符串,fputs() 函数输出字符串。fgets() 函数在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也做为字符串的一部分。通过 scanf() 函数和 gets() 函数输入一个字符串的时候,不包含结尾的“\n”,但通过 fgets() 函数结尾多了“\n”。fgets() 函数是安全的,不存在缓冲区溢出的问题。
#include <stdio.h>
int main()
{
char array[15];
printf("请输入字符串:\n");
fgets(array,sizeof(array),stdin);
printf("你输入的字符串为:\n");
fputs(array,stdout);
return 0;
}
fgets() 获取字符串少于元素个数会有 '\n',大于等于没有 '\n'。
三、字符串处理函数
3.1、字符串长度
size_t strlen( const char *str ); // 获取源字符串的有效长度
#include <stdio.h>
#include <string.h>
int main()
{
char array[15] = "hello world!" ;
int length = 0;
length = strlen(array);
printf("字符串的长度为:%d\n",length);
length = 0;
while(array[length])
length++;
printf("字符串的长度为:%d\n",length);
return 0;
}
3.2、字符串复制
char *strcpy( char *dest, const char *src ); // 复制源字符串数组到目标字符串中
char *strncpy( char *dest, const char *src, size_t count ); // 复制源字串的n个字符复制到目标字符串中
#include <stdio.h>
#include <string.h>
int main()
{
char array[15] = "hello world!" ;
char array1[15] = {0};
char array2[15] = {0};
strcpy(array1,array);
printf("%s\n",array1);
strncpy(array2,array,5);
printf("%s\n",array2);
return 0;
}
3.3、字符串连接
char *strcat( char *dest, const char *src ); // 将源数组的字符串连接到目标数组后
char *strncat( char *dest, const char *src, size_t count ); // 将源数组的指定个数字符连接到目标数组后
#include <stdio.h>
#include <string.h>
int main()
{
char array1[15] = "hello " ;
char array2[15] = "hello " ;
char array3[15] = "world!";
strcat(array1,array3);
printf("%s\n",array1);
strncat(array2,array3,5);
printf("%s\n",array2);
return 0;
}
3.4、字符串比较
字符串比较就是将一个字符串与另一个字符串从首字母开始,按照 ASCII 码的顺序进行逐个比较。在 C语言中,通过 strcmp() 函数 或者 strncmp() 函数进行字符串的比较。
int strcmp( const char *lhs, const char *rhs ); // 将两个字符串从首字符按ASCII进行比较,相同返回0,lhs大返回整数,rhs大返回负数
int strncmp( const char *lhs, const char *rhs, size_t count ); // 将两个字符串前count字符按ASCII进行比较,相同返回0,lhs大返回整数,rhs大返回负数
strcmp() 函数 和 strcmp() 函数的功能就是按照 ASCII 码的顺序比较两个数组中的字符串,并由函数返回值返回函数结果:
- 字符串1 = 字符串2,返回值为 0
- 字符串1 > 字符串2,返回值为 正数
- 字符串1 < 字符串2,返回值为 负数
#include <stdio.h>
#include <string.h>
int main()
{
char array1[15] = "hello world!" ;
char array2[15] = "hello sakura!" ;
int result = 0;
result = strcmp(array1,array2);
if(result < 0)
{
printf("第一个字符串大\n");
}
else if(result > 0){
printf("第二个字符大\n");
}
else{
printf("两个字符串相等\n");
}
result = strncmp(array1,array2,5);
if(result < 0)
{
printf("第一个字符串大\n");
}
else if(result > 0){
printf("第二个字符大\n");
}
else{
printf("两个字符串前5个字符相等\n");
}
return 0;
}
标签:字符,08,char,数组,printf,字符串,array
From: https://www.cnblogs.com/kurome/p/17159239.html