C 语言中的字符串


2021年8月23日, Learn eTutorial
2175

在本教程中,您将掌握C语言编程中关于字符串的所有知识。此外,您还将借助用户友好的示例,学习如何声明和初始化字符串,以及输入和输出字符串的各种方法等。同时,我们还会介绍一些用于操作C语言中字符串的常用库函数。

字符串常量

与其他编程语言不同,在C语言中,字符串不是一种基本数据类型,而是一组相邻字符的集合。我们可以通过字符数组来生成它,以便在程序中使用单词和句子。由于它是一个字符数组,每个单词的末尾都包含一个空字符,以表示空间的终止。在C语言编程中,字符串写在双引号(" ")内,例如

  • "Computer "
  • "Programming in C"
  • " "

字符串的视觉表示如下

C String

这就是编译器如何处理一个用双引号括起来的字符序列,并默认在末尾追加一个空字符‘\0’。

如何声明字符串变量

我们可以使用任何合法的变量名作为字符串变量的名称,并将其声明为数组。 

字符串声明的原型是


char string_name [SIZE];

我们可以通过'SIZE'来计算字符串内的最大字符数。如果我们在字符串中存储任何变量,编译器会在任何字符串的末尾添加一个空字符('\0')。因此,'SIZE'将显示比实际字符数多一的数字。如果我们声明,


char name[9];

编译器将允许我们在已声明的字符串'name'中放置8个字符,后面跟着一个空字符。该字符串将被分配为 
 

C String

如何在C语言中初始化字符串变量

我们可以在声明字符串变量时确定其值。有多种方法可以初始化字符串变量。


char city[] = “Madrid”;
char city[7] = “Madrid”;
char city[7] = {‘M’, ‘a’, ‘d’, ‘r’, ‘i’,  ‘d’};

这里 "MADRID" 将被存储为 

C String

为字符串变量赋值

由于字符串属于数组类型,因此不可能在声明后单独为字符串变量赋值,如下面的程序所示。


#include<stdio.h>
main()
{
    char c[10];
    c = "Learn C";
    printf("%s",c);
}

这个例子会引发如下错误。


error: assignment to expression with array type

在这种情况下,可以使用字符串函数 strcpy()

如何遍历字符串

在大多数编程语言中,字符串遍历是一个重要的方面。遍历意味着编译器允许我们确定字符串中每个数组元素的值。在遍历字符串时,无需事先知道字符串的大小,因为空字符表示序列的结束。如果字符串末尾不存在空字符,它将被视为仅仅是字符的集合。这是因为编译器无法理解字符串在哪里结束。 

从下面的例子中,我们可以发现-


#include <stdio.h>
main()
{
       char name [ ] = "Learn eTutorials";
        int i =0,count=0;
        while (name [i] != '\0')
         {
            if(name[i]=='a' || name[i] == 'e' || name[i] == 'i' || name[i] == 'u' || name[i] == 'o')
          {
            count ++;
          }
               printf ("%c ", name [i]);
                i++;
        }
        printf("\nNumber of Vowels in string %s is :%d",name,count);
}

输出


L e a r n   e T u t o r i a l s
Number of Vowels in string Learn eTutorials is :7

如果我们运行该程序,它将打印“Learn eTutorials”。显然,while循环会继续打印数组元素的每个字符,直到遇到空字符。同时,它会计算给定字符串中元音字母的数量。

这里 %c 是用于逐个打印字符串字符的格式说明符,而 %s 是用于打印字符串字面量的格式说明符。

如何使用指针操作字符串 

通过我们之前的教程,我们已经对C语言中的指针有了很好的了解。现在我们也可以使用指针来操作字符串。由于字符串是字符数组,指针在字符串上的工作方式与在数组上的工作方式相同。它通过在指针中存储数组的地址(第一个元素的地址)来工作。

这是一个示例程序。 


#include <stdio.h>

int main() {
  char name[] = "Steve Jobs";

  printf("%c\n", *name);     
  printf("%c\n", *(name+2));   
  printf("%c\n", *(name+6));   

  char *Ptr;
  Ptr = name;
  printf("\n%s", Ptr);
}

输出


S
e
J

Steve Jobs

字符串I/O函数

C语言中有一组I/O函数,用于从键盘获取输入并根据需要将其显示在屏幕上。最常用的输出函数有:printf()、puts()、putchar(),输入函数有:scanf()、gets()、getchar()、getch()、getche()。

使用scanf和printf读写字符串

在我们系列教程的整个过程中,您已经看到了使用 scanf 从键盘读取输入和使用printf写入输出。毫不奇怪,scanfprintf 也可以用来访问字符串。但唯一的区别是,在使用 scanf 时,您只能读取字符串直到遇到空白字符,如换行符、制表符或空格。

下面这个例子演示了 scanfprintf 在字符串上的功能


#include<stdio.h>
int main()
{

   char name[10];

   printf("Enter your full name:");
   scanf("%s",name);

   printf("Full Name :%s",name);

}

输出


Enter your full name:Chris Jake
Full Name :Chris

从输出中可以明显看出,尽管输入的是Chris Jake,但 scanf 只读取了第一个字符串Chris,因为它之后遇到了空白字符。这里 %s 被用作格式说明符来使用 scanfprintf。 

使用gets()和puts()读写字符串

在C语言中,我们可以使用 gets()puts() 函数来读写字符串。下面的例子简单地演示了 gets()puts() 函数的用法。 


#include <stdio.h>
int main()
{
       char nm[40];
       puts ("Type anything you wish:");
       gets(nm);
       puts(nm);

}

输出


Type anything you wish:
Welcome to Learn eTutorials... Let's learn C
Welcome to Learn eTutorials... Let's learn C

在这里可以清楚地看到,gets() 会读取并存储我们通过键盘输入的任何内容,无论其大小如何。这可能导致缓冲区溢出。为了防止这种情况,C语言开发了另一个名为 fgets() 的函数,在其中我们需要指定大小限制。


#include <stdio.h>
int main()
{
       char nm[40];
       puts ("Type anything you wish:");
       fgets(nm,sizeof(nm),stdin);
       puts(nm);

}

如何将字符串作为参数传递给函数

和数组一样,我们也可以将字符串传递给函数。我们可以通过带指针或不带指针的方式将字符串作为参数传递给函数。下面展示的例子说明了这两种情况。 

不带指针传递字符串


#include <stdio.h>
void printString(char str[]);

int main()
{
    char str[50];
    printf("Enter desired string: ");
    fgets(str, sizeof(str), stdin);             
    printString(str);        
    return 0;
}
void printString(char str[])
{
    printf("String printed as: ");
    puts(str);
}

输出


Enter desired string: Welcome to Learn eTutorials
String printed as: Welcome to Learn eTutorials

在这个例子中,由于 str 是一个字符数组,printString 函数期望一个字符串数组作为其参数,因此我们将字符串作为 str[] 传递,并使用 fgetsputs 函数来读取和写入字符串。

使用指针传递字符串

这可能是一种将字符串作为参数传递给函数的简单且不易出错的方式。上面的代码片段将修改如下:


#include <stdio.h>
void printString(char *strptr);

int main()
{
    char *strptr[50];
    printf("Enter desired string: ");
    fgets(strptr, sizeof(strptr), stdin);             
    printString(strptr);       
    return 0;
}
void printString(char *strptr)
{
    printf("String printed as: ");
    puts(strptr);
}

输出


Enter desired string: Welcome to Learn eTutorials
String printed as: Welcome to Learn eTutorials

这里我们声明了一个字符指针,所以printString()函数期望指针变量作为其参数。这意味着我们将字符串的地址(strptr)传递给函数,因此,在函数中对字符串所做的任何更改都会反映出来。

字符串库函数

字符串函数是编程语言中不可或缺的一部分,因为它让你的字符串操作变得更简单,只需简单地调用特定的函数并在你的代码中任何需要的地方实现它们。字符串操作,如复制字符串、连接字符串或任何其他功能,都可以通过这些预定义函数轻松调用。 

下表中列出了一些最常用的字符串函数及其详细信息

函数 函数功能
strlen() 确定字符串的长度
strcpy() 将一个字符串复制到另一个字符串
strcat() 连接(拼接)两个字符串
strcmp() 比较两个字符串
strlwr() 将字符串转换为小写
strupr() 将字符串转换为大写

1. Strlen()

顾名思义,strlen() 计算字符串的长度,不包括空字符或结束字符(\0)。


#include<stdio.h>
#include<string.h>
void main()
{
    char str[20]="Learn eTutorials";
    printf("Enter the length of string:%d\n",strlen(str));
    printf("Enter the size of string: %d\n",sizeof(str));
}

输出


Enter the length of string:16
Enter the size of string: 20

从这个例子中,您可以明显地观察到 strlensizeof 运算符之间的区别。Strlen 确定字符串的长度,而 sizeof 运算符返回字符串的大小(总分配空间)。

2. Strcpy()

这个函数用于将一个字符串复制到另一个字符串。因此,strcpy() 接受两个参数,字符串1和字符串2,并将字符串2复制到字符串1,如下例所示。


#include<stdio.h>
#include<string.h>
void main()
{
    char s1[30]="Learn eTutorials";
    char s2[30]="C programming Language ";
    printf("String copied to S1 is :%s\n",strcpy(s1,s2));

}

输出


String copied to S1 is :C programming Language

3. Strcat()

strcpy() 类似,此函数也接受两个参数并返回连接后的字符串。下面的例子展示了两个字符串的连接。


#include<stdio.h>
#include<string.h>
void main()
{
    char s1[30]="C Programming";
    char s2[30]=" Language ";
    printf("Concatenated String is :%s\n",strcat(s1,s2));

}

输出


Concatenated String is :C Programming Language

4. Strcmp()

strcmp() 函数比较两个字符串并返回一个整数值。

  • 如果 s1==s2,它返回零。
  • 如果 s1<s2,它返回一个负整数 
  • 如果 s1>s2,它返回一个正整数。
     

#include<stdio.h>
#include<string.h>
void main()
{
    char s1[30]="Language";
    char s2[30]="Language";
    if (strcmp(s1,s2)==0)
    {
        printf("Strings are equal");
    }
    else
    {
        printf("Strings are different");
    }

}

输出


Strings are equal