如何理解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语言中的字符串操作-创新互联
文章转载:http://myzitong.com/article/dhpece.html