如何理解C语言中的字符串操作-创新互联

我的困境

在C++中,有关字符串的操作一般会使用头文件。我会把string当作一个新的,不同于其他的数据类型。但是在C语言的学习中,我发现C语言字符串本质上还是char数组。这导致我在学习C语言字符串时出现了一定的困难。我决定做一个梳理。

创新互联是一家专注于网站设计、成都网站制作与策划设计,泽州网站建设哪家好?创新互联做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:泽州等地区。泽州做网站价格咨询:028-869222201 字符串的定义

C语言对于字符串的定义有2种方式。

第一种:

#includechar ch[81] = "\0";    //其中的[81]可以写为[]

在第一种定义方式中,可以很明显看出C语言的字符串就是一组字符数据的数组。在此定义方法中,数组元素个数可以规定,也可以省略,但是可能会由于编译器的原因报错(猜测,在GCC和VisualC++中都不会报错)。

第二种:

#includechar ch2[] = {'A','N','D','R','O','I','D','\0'};

在第二种定义方式更强调数组元素。同样,定义字符串时,ch2元素个数可以忽略(在标注元素个数的情况下要注意数组越界),与此同时,末尾的'\0'也可以忽略。

虽然两种定义方法都是以char数组方式定义的,但是在数组元素上会有不同。

如图,第一种定义的字符串"steve jobs"总共10个字符,但是Visual Studiio中显示的是ch[11]。

而第二种定义的字符串总共7个字符,Visual Studio中显示的是ch[7]。我猜测原因是编译器把ch[7]认为是数组,而不是字符串,所以末尾没有。 

C++中定义字符串的方式除了上述两种C风格字符串以外,由于拥有新的数据类型string,直接使用string数据类型是最好的方法(因为使用C风格定义方式会有一定的安全问题)。

#include#includeusing namespace std;

string str = "watch out!";

string字符串明显比char数组更容易理解,也更容易操作。不过实际上仍然是char数组ㄟ( ▔, ▔ )ㄏ

(并且最后还是'\0')

2 字符串的输入与输出 2.1 输入

C语言中,字符串的输入方法有3种

第一种:使用scanf函数输入不含空格的字符串

#includechar str1[] = "\0";
scanf("%s", str1);

第二种:使用gets函数输入有空格的字符串

#includechar str2[] = "\0";
gets(str2);

gets函数会在用户输入换行符(也就是'\n')的时候,会结束输入,并且把'\n'改为'\0'。

注意:两个gets不能连用,也不能在scanf后直接使用,否则会报错。

第三种:使用putchar函数输入字符串(比较困难)

#include#define MAX 81
char str3[MAX] = "\0";

for(int i = 0; i< MAX; i++)
{
    char temp;
    temp = getchar();

    if(temp != '\n')
    {
        str3[i] = temp;
    }
    else
    {
        break;
    }
}

缺点是需要在定义字符串时确定其大长度。(gets就挺好用的)

C++在使用gets时因为安全原因要改为gets_s 。

其实在C++中使用getline函数无疑是最有效的。

2.2 输出

C语言输出字符串可以使用printf函数(%s),也可以使用puts函数。

当然,也可以使用putchar函数输出字符串,只不过一样需要用到for循环。

3 字符串的操作与处理 3.1 三个重要的头文件

如果在输入字符串之后要分析字符串,或者对字符串做出改动的话,就需要用到这三个头文件:

string.h,stdlib.h,ctype.h。

3.1.1 string.h

这个头文件中有6个较为常用的函数

(摘自RONOOB)

这六个函数其实很好理解,从图中就可以了解函数的用途。

在string.h中还有一些函数

1)strncpy(char* s1, char* s2, int n)指的是把s2中的前n个字符复制粘贴到s1上。

#include#includeint main()
{
    char ch1[] = "Visual Studio";

    char ch2[] = "\0";
    strncpy_s(ch2, ch1, 5);
    puts(ch2);

    return 0;
}

输出的值是Visua。

2)strncmp(char* s1, char* s2, int n)和strcmp同理,只不过比较前n个字符

3)strtok(char* s, const char* delim)的作用是把一个字符串分成多个字符串。delim指分隔符。

#include#includeint main()
{
    char ch1[] = "Visual Studio 2022 Installer";

    //get the first string
    char* token;
    const char delim[2] = " ";  //this is space

    token = strtok(ch1, delim);

    //get the remaining string
    while (token != NULL)
    {
        printf("%s\n", token);

        token = strtok(NULL, delim);
    }

    return 0;
}

(改编自RUNOOB)

可以看到, 空格作为了分隔符,所以输出的结果是:

Visual

Studio

2022

Installer

(后面获取剩余部分我还没有看懂)

3.1.2 stdlib.h

stdlib.h是一个非常实用的头文件,其中包含着比如srand,exit函数,不过此处涉及到的函数时头文件中关于字符串的常用的函数。

1)atoi(const char* str)可以把字符串(内容是整数)改变为int类型的变量。

如果数字太大可以用atol函数,这个函数的返回值是long长整型。

2)atof(const char* str)可以把字符串(内容是小数)改变为float浮点数。

3)itoa(int value, char* string, int radix)可以把整型数字变为字符串。

其中value为要变换的整型值,string是接收变换后的数字的字符串变量,radix为进制,如2,8,10,16等。如果radix为8,则会把value先变为八进制数,再变为字符串。

3.1.3 ctype.h

ctype.h可以帮助我们更好地找出并处理字符串中一些特定的信息。

(摘自RUNNOOB)11个函数的返回值都是int,当条件成立(比如islower中的参数为一个小写字母),则会返回一个非零值(true),如果不成立,则返回0。

#include#includeint main()
{
    int i = 'p';

    if (islower(i))
    {
        printf("a lower letter %c.\n",i);
    }
    else
    {
        printf("a upper letter %c.\n",i);
    }

    int j = 'A';
    if (islower(j))
    {
        printf("a lower letter %c.\n",j);
    }
    else
    {
        printf("a upper letter %c.\n",j);
    }

    return 0;
}

输出的结果为:

a lower letter p.
a upper letter A. 

除此之外,还有涉及大小写转换的两个函数

可以使用这个函数把一个char数组中的字母全部改为大写,或者全部改为小写,或者只更改特定的字母。

3.2 关于字符串的比较大小

我很好奇,为什么字符串要比较大小。

不清楚,不过要比较大小的话一个strcmp完事。

关于字符串的比较方式,strcmp会逐个字母比较其ASCII值大小,除非遇到了可以比较出大小的情况(比如遇到了不同的字母,或者是遇到了'\0'。

#include#includevoid compare(char* str01, char* str02)
{
    int result = strcmp(str01, str02);
    if (result >0) {
        printf("%s is larger than %s.\n", str01, str02);
    }
    else if (result == 0) {
        printf("%s is equal to %s.\n", str01, str02);
    }
    else {
        printf("%s is smaller than %s.\n", str01, str02);
    }
}

int main()
{
    char str1[] = "A";
    char str2[] = "At";
    char str3[] = "at";
    char str4[] = "atmosphere";
    char str5[] = "application";
    char str6[] = "A";

    compare(str1, str6);
    compare(str1, str2);
    compare(str2, str3);
    compare(str4, str5);

    return 0;
}

输出结果为:

A is equal to A.
A is smaller than At.
At is smaller than at.
atmosphere is larger than application.
关于常用函数记忆

怎么说,我发现从讲开字符串时,讲函数用法的部分越来越多了,并且有些函数(比如strcpy,strcmp,strncpy这些)比较容易混淆。

我决定不采用拼写字母的方式记忆这些函数。不把strcpy念成"S T R C P Y"而是"string copy",strncmp是"string n compare",以及头文件念成"standard library",这样的话不仅更好念,也更好记。

如有错误请指出,谢谢。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧

本文标题:如何理解C语言中的字符串操作-创新互联
浏览路径:https://www.cdcxhl.com/article24/dhpece.html

成都网站建设公司_创新互联,为您提供网站设计静态网站域名注册搜索引擎优化网站建设定制网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

网站建设网站维护公司