第六章:数组类型-2字符串

C 字符串

目标

在本文章中,您将学习C字符串以及如何有效地操作字符串。

介绍C字符串

字符串是字符序列。C语言没有内置的字符串类型。相反,它使用一个字符数组来定义字符串。因此,C语言中的字符串是一个字符数组。

为了标记字符串的结尾,C使用特殊字符'\0'。'\0'被称为空字符。当你显示字符串时,' \0 '不会显示。

null字符的ASCII码为0(零)。C不把空字符计算在字符串长度中。但是在定义字符串时,需要在数组中保留一个元素来存储空字符。

重要的是要注意null字符并不等同于null指针常量。

下面的例子定义了一个包含6个字符的字符串(包括空字符),将字符赋值给字符串数组元素,并在输出中显示该字符串:

#include 

int main()
{
    char message[6];

    // 赋值字符串元素
    message[0] = 'H';
    message[1] = 'e';
    message[2] = 'l';
    message[3] = 'l';
    message[4] = 'o';
    message[5] = '\0';

    // 显示字符串
    printf("%s", message);

   return 0;
}

输出:

Hello

它是怎么执行的。

  • 第一,定义字符串message,它是一个由6个字符组成的数组。
  • 第二,将字符分配给单个字符串元素。要结束一个字符串,将'\0'字符赋值给最后一个元素。
  • 第三,在输出中显示字符串。要显示字符串,可以使用%s格式说明符。
    C允许将字符串初始化为字符串字面量。在这种情况下,编译器将在字符串的末尾添加\0字符。例如:
char message[6] = "Hello";

在这个例子中,字符串“Hello”有5个字符。但是,您需要使用6作为数组的大小来存储空字符。

为了简单起见,可以将中括号置空:

char message[] = "Hello";

如果设置字符串的大小并在字符串中放入更多字符,就会得到字符串溢出错误。

将字符串字面量赋给字符串变量:

要定义字符串字面量,您需要将文本包含在双引号""中。例如:

"Hello"

因为C不允许你将一个数组赋值给另一个数组,所以你不能像这样将字符串字面量赋值给字符串变量:

message = "Hello";

相反,您需要使用标准库函数strcpy()将字符串字面量复制到变量。strcpy()复制整个字符串,包括空字符。要使用strcpy()函数,需要包含string.h标准库。

下面的示例演示了如何将message字符串初始化为“Hello”:

#include 
#include 

int main()
{
    char message[6];

    // 把“Hello”赋值给message
    strcpy(message, "Hello");

    printf("%s", message);

    return 0;
}

获得字符串长度:strlen()

c使用可变长度字符串。例如:

#include 
#include 

int main()
{
    char first_string[100] = "Hello";
    printf("%s", message);

    return 0;
}

这个例子定义了一个最多可以容纳100个字符的字符串。数组的大小为100。但是字符串的长度是5。

要获取字符串的长度,可以使用标准库函数strlen():

#include 
#include 

int main()
{
    // 把 "Hello" 赋值给字符串
    char first_string[100] = "Hello";

    // 获得字符串的长度
    int len = strlen(first_string);
    printf(" first_string 的长度是 %d", len);

    return 0;
}

将两个字符串连接成一个:strcat()

要将两个字符串连接成一个字符串,可以使用标准库函数strcat()。例如:

#include 
#include 

int main()
{
    char first_string[25] = "Hello",
        last_string[25] = "World",
        full_string[50];

    // 把first_string拷贝给full_string
    strcpy(full_string, first_string);
    // 连接“ ”和full_string
    strcat(full_string, " ");
    // 连接last_string和full_string
    strcat(full_string, last_string);

    // 显示full_string
    printf("%s", full_string);

    return 0;
}

输出:

Hello World

它是怎么执行的。
第一,声明三个变量用于存储三个字符串 first_stringlast_stringfull_string

    char first_string[25] = "Hello",
        last_string[25] = "World",
        full_string[50];

第二,拷贝字符串first_string到full_string:

    // 把first_string拷贝给full_string
    strcpy(full_string, first_string);

第三,连接字符串“ ”和full_string:

    // 连接“ ”和full_string
    strcat(full_string, " ");

第四,连接last_string和full_string:

    // 连接last_string和full_string
    strcat(full_string, last_string);

最后,显示full_string:

    // 显示full_string
    printf("%s", full_string);

从标准输入中读取一个字符串

标准函数fgets()允许从键盘(或标准输入)读取字符串。下面是fgets()函数的一般语法:

fgets(名字,sizeof(名字),stdin)

在这个语法:

  • 名称指定了一个字符串变量。
  • sizeof(名字)表示要读取的最大字符数(加1个null字符)。
  • stdin是标准输入,在本例中是键盘。
    如果按下Enter键,fgets()函数还会从键盘读取行尾字符(\n)。

下面的例子展示了如何从键盘读取字符串:

#include 
#include 

int main()
{
    char message[100];

    // 从输入中读取字符串
    fgets(message, sizeof(message), stdin);

    // 显示输入字符串
    printf("%s", message);
    printf("字符串的长度是 %d\n", strlen(message));

    // 显示字符
    for (int i = 0; i < strlen(message); i++)
    {
        if (message[i] == '\0')
            printf("message[%d] = NUL\n", i);
        else if (message[i] == '\n')
            printf("message[%d] = NEW_LINE\n", i);
        else
            printf("message[%d] = %c\n", i, message[i]);
    }

    return 0;
}

如果您输入消息hi并按enter,您将看到以下输出:

hi
hi
字符串的长度是 3
message[0] = h
message[1] = i
message[2] = NEW_LINE

可以看到,字符串的最后一个字符是新行字符(\n),而不是NUL字符(\0)。

要解决这个问题,你需要用\0结束字符串:

message[strlen(message) - 1] = '\0';

下面的程序通过使用NUL字符('\0')来修复从键盘读取的字符串:

#include 
#include 

int main()
{
    char message[100];

    // 从输入获得字符串
    fgets(message, sizeof(message), stdin);

    message[strlen(message) - 1] = '\0';
    // 显示输入字符串
    printf("%s\n", message);
    printf("字符串长度是 %d\n", strlen(message));

    return 0;
}

输出:

hi
hi
字符串长度是 2

比较两个字符串

要比较两个字符串,可以使用strcmp()函数。strcmp()比较每个字符串的第一个字符,如果它们相等,则继续每个字符串中的第二个字符,直到字符不同或达到NUL字符。

strcmp()如果第一个字符串在第二个字符串之前返回-1,如果两个字符串相等返回0,如果第一个字符串在第二个字符串之后返回1。

请看下面的例子:

#include 
#include 

int main()
{
    char sender[25] = "xiaoming",
         receiver[25] = "xiaowang";

    int result = strcmp(sender, receiver);

    printf("%d", result); // -1

    return 0;
}

输出:

-1

程序显示-1表示字符串“xiaoming”在“xiaowang”之前。

总结

  • 在C语言中,字符串是一个字符数组。字符串使用null字符('\0')来表示字符串的结束。
  • 使用strcpy()函数将一个字符串复制到另一个字符串。
  • strlen()函数的作用是:获取字符串的长度。
  • 使用strcat()函数将两个字符串连接成一个字符串。
  • 使用strcmp()函数比较两个字符串。
  • 在printf()函数中使用%s格式说明符向输出显示一个字符串。

你可能感兴趣的:(第六章:数组类型-2字符串)