【C语言】字符串

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)

相关推荐

  1. C语言字符串函数

    2024-04-01 15:34:03       43 阅读
  2. 字符串摘要(C语言

    2024-04-01 15:34:03       28 阅读
  3. C语言复习 -- 字符串

    2024-04-01 15:34:03       22 阅读
  4. C语言字符串

    2024-04-01 15:34:03       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-01 15:34:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-01 15:34:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-01 15:34:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-01 15:34:03       20 阅读

热门阅读

  1. 3498. 日期差值

    2024-04-01 15:34:03       17 阅读
  2. 第八章 贪心算法 part05

    2024-04-01 15:34:03       18 阅读
  3. CSS学习

    2024-04-01 15:34:03       18 阅读
  4. Hive查询转换与Hadoop生态系统引擎与优势

    2024-04-01 15:34:03       18 阅读
  5. python语言访问字典元素

    2024-04-01 15:34:03       14 阅读
  6. c++ vector介绍

    2024-04-01 15:34:03       17 阅读
  7. 嵌入式C语言--GPT通用定时器

    2024-04-01 15:34:03       19 阅读
  8. vue3中watch详解

    2024-04-01 15:34:03       16 阅读
  9. Node.js常用命令

    2024-04-01 15:34:03       19 阅读