C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的各字符
- 一维字符数组:存放一个字符串(每个数组元素存放一个字符)
- 二维字符数组:存放多个一维数组(字符串);二维数组的行数是字符串的个数
类型:char
char c[6]={'a','b','c','d','e','f'};
//定义一个字符数组c,并以单个字符初始化赋值
char s[7]="abcdefg";
//等同于char s[7]={"abcdefg"};
//定义一个字符数组s,并以字符串初始化赋值
//如有定义以下字符数组:
char s[10];
//方法一:以%c的格式循环输入输出
for(int i=0;i<10;i++){scanf("%c",&a[i]);
}
for(int i=0;i<10;i++){printf("%c",a[i]);
}
//方法二:以%s的格式输入输出
scanf("%s",a);
printf("%s",a);
字符数组的结束标志为’\0’,系统在字符数组初始化赋值时会自动在末尾加一个’\0’作为字符串的结束标志,'\0’会占用一个字符大小的内存。定义字符数组时至少需要多给一个。
中文字符的使用:一个汉字占两个字节
char ch[]="爱";//数组大小有3字节
printf("%s",ch);
通常定义将要使用的字符数组,放’\0’进行初始化
char str2[100]={'\0'};
空格、回车或制表(Tab)符是输入数据的分隔符,因而不能被读入,输入遇到这些字符时,系统认为字符串输入结束。
char str3[100]={'a','b','c','\0','d','e'};
printf("%s",str3);//输出结果:abc
//如果从键盘输入空格,效果也是一样的
那么输入的字符串有空格怎么办?
gets(str3);//从键盘上输入字符串,以回车结束
puts(str3);//输出字符串,将字符串全部输出并自带一个换行
#include<stdio.h>
int main(){char name[3][10]={{"张三 你好"},{"李四你好!"},{"王五hello"}};for(int j=0;j<3;j++){puts(name[j]);}return 0;
}
以上的三个字符串都不能再添加内容,因为它们的字节上限是10
那"张三你好吗"行不行呢?这个问题留给你。
以上是“数组-字符数组”的内容,下面将进行补充
常用函数
头文件:
#include<string.h>
函数名 | 简介 | 使用 |
---|---|---|
memset | 给数组赋初值 | memset(arr,‘0’,sizeof(arr)) |
strcmp | 比较两个字符数组 | strcmp(arr1,arr2) |
strncmp | 比较两个字符数组的前n个元素 | strcnmp(arr1,arr2,n) |
strcpy | 拷贝arr2到arr1 | strcpy(arr1,arr2) |
strncmp | 拷贝arr2指向的前n个元素到arr1 | strncmp(arr1,arr2,n) |
strcat | 将arr2拼接到arr1后 | strcat(arr1,arr2) |
strncat | 将arr2指定长度的字符串追加到arr1后 | strncat(arr1,arr2,n) |
strchr | 查找字符串第一次出现字符的位置 | strchr(arr,ch) |
strrchr | 查找字符串最后一次出现字符的位置 | strrchr(arr,ch) |
strstr | 查找字符串在字符串中出现的位置 | strstr(arr,ch) |
strupr | 将字符串转大写 | strupr(arr) |
strlwr | 将字符串转小写 | strlwr(arr) |
strlen | 求字符串长度(不算结尾的’\0’) | strlen(arr) |
strtok | 对字符串按照子字符串c(可以是单个字符)进行分割,返回分割后的子字符串 | strtok(str,c) |
strerror | 字符串报错 | strerror(errnum) |
#include<stdlib.h>
函数名 | 简介 | 使用 |
---|---|---|
atoi | 将字符串str转为整型(支持正负数识别) | atoi(str) |
atof | 将字符串str转为浮点型(支持正负数识别) | atof(str) |
strtol | 把参数str所指向的字符串根据给定的base转换为一个长整数 | strtol(const char *str, char **endptr, int base) |
说明:
int a[100] = {0};// 初始化一个全0的数组
bool b[100] = {false};// 初始化一个全为false的数组
将‘0’改为‘1’,能初始化一个全1的数组吗?
将‘false'改为‘true',能初始化一个全true的数组吗?
答案是不能,想想为什么?
int a[100];
memset(a, 1, sizeof(a));// 不能初始化一个全1的数组
bool b[100];
memset(b, true, sizeof(b));// 可以初始化一个全为true的数组
使用`memset(a, 1, sizeof(a))`并不能初始化一个全1的数组,实际运行之后,数组中的每个值都是`16843009`,即二进制的`00000001 00000001 00000001 00000001`。为什么使用memset函数会出现这种情况呢?原因很简单就是由于memset函数在做初始化的时候是以字节为单位的(1Byte,也就是8位二进制数)。由于bool类型和char类型均为1个字节。所以在进行初始化的时候不会发生任何问题(bool类型在存入数组是会进行类型转换,0为false,非0为true)。但是一个int型变量是4个字节,也就是32位二进制数。那么在初始化时会将4个用于初始化的字符组合成一个int型的值。如果要将int数组全部初始化为一个非0数的话,应该怎么做?
strcmp实际上是对字符的ASCII码进行比较。返回结果:str1<str2,返回负值(-1);str1>str2,返回正值(1);str1=str2,返回0
strstr查找字符串在字符串中出现的位置。如果存在则返回指针位置,不存在则返回null
//char *strtok(char *str, const char *delim) 分解字符串str为一组字符串,delim为分隔符。
#include <string.h>
#include <stdio.h>
int main () {char str[80] = "This is - www.runoob.com - website";const char s[2] = "-";char *token;/* 获取第一个子字符串 */token = strtok(str, s); /* 继续获取其他的子字符串 */while( token != NULL ) {printf( "%s\n", token );token = strtok(NULL, s);}return(0);
}
char * strerror ( int errnum ):用于获取指向错误消息字符串的指针。返回值为char*类型,只想描述错误的字符串的指针。C语言的库函数在执行失败时,都会有一个错误码(0 1 2 3 4 5 6 7 8 9 ...)。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{printf("%s\n",strerror(0));printf("%s\n",strerror(1));printf("%s\n",strerror(2));printf("%s\n",strerror(3));printf("%s\n",strerror(4));printf("%s\n",strerror(5));printf("%s\n",strerror(6));return 0;
}
/*
运行结果:
No error
Operation not permitted
No such file or directory
No such process
Interrupted function call
Input/output error
No such device or address
*/
//场景:打开文件错误,自动生成错误码为2,通过strerror()函数显示错误信息。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{FILE * pfile;pfile = fopen("test.tt","r");printf("错误码:%d\n",errno);if(pfile == NULL){printf("打开文件失败 代码:%s",strerror(errno));}return 0;
}
/*运行结果:
错误码:2
打开文件失败 代码:No such file or directory
*/
//atoi
#include <stdio.h>
#include <stdlib.h>
int main()
{char str1[10]="100";char str2[10]="010";char str3[10]="10s";char str4[10]="s10";char str5[10]="str";int value1=atoi(str1);int value2=atoi(str2);int value3=atoi(str3);int value4=atoi(str4);int value5=atoi(str5);printf("%d\n",value1);printf("%d\n",value2);printf("%d\n",value3);printf("%d\n",value4);printf("%d\n",value5);return 0;
}
/*运行结果:
100
10
10
0
0
*/
//如果在以上的字符串前都加一个"-"
/*运行结果:
-100
-10
-10
0
0
*/
//atof
#include <stdio.h>
#include <stdlib.h>
int main()
{char str1[10]="-100.0";char str2[10]="-010.0";char str3[10]="-10.0s";char str4[10]="-s10.0";char str5[10]="-.0str";float value1=atof(str1);float value2=atof(str2);float value3=atof(str3);float value4=atof(str4);float value5=atof(str5);printf("%f\n",value1);printf("%f\n",value2);printf("%f\n",value3);printf("%f\n",value4);printf("%f\n",value5);return 0;
}
/*运行结果:
-100.000000
-10.000000
-10.000000
0.000000
-0.000000
*/
atoi()和atof()函数有一个缺点是:如果当字符串是其他非数字字符,会返回0,如果是数字0的话,照样返回0,这样就无法辨别到底是字符’0’还是其他非数字字符。而strtol()可以识别数字字符’0’。
//根据函数运行后endptr的位置可以对上述问题进行区分,如果是’0’,endptr指向原字符串首位
#include <stdio.h>
#include <stdlib.h>
int main()
{char str[10] = "0";char *tt;int value;value = strtol(str,&tt,10);if(tt != str){printf("转后的数字为:%d",value);}else{printf("转化的是字符!");}return 0;
}
strtol()更多内容请访问:C 库函数 – strtol() | 菜鸟教程 (runoob.com)