C 语言编程教程

C 语言 - 首页

C 语言基础

C 语言 - 概述 C 语言 - 特性 C 语言 - 发展历史 C 语言 - 环境设置 C 语言 - 程序结构 C 语言 - Hello World C - 编译过程 C - 注释 C - 标记 C - 关键字 C - 标识符 C - 用户输入 C - 基本语法 C - 数据类型 C - 变量 C - 整数提升 C - 类型转换 C - 类型转换 C - 布尔值

C 语言中的常量和文字

C - 常量 C - 字面量 C - 转义序列 C - 格式说明符

C 语言中的运算符

C - 运算符 C - 算术运算符 C - 关系运算符 C - 逻辑运算符 C - 位运算符 C - 赋值运算符 C - 一元运算符 C - 递增和递减运算符 C - 三元运算符 C - sizeof 运算符 C - 运算符优先级 C - 其他运算符

C 语言中的决策

C - 决策 C - if 语句 C - if...else 语句 C - 嵌套 if 语句 C - switch 语句 C - 嵌套 switch 语句

C 语言中的循环

C - 循环 C - While 循环 C - For 循环 C - Do...while 循环 C - 嵌套循环 C - 无限循环 C - Break 语句 C - Continue 语句 C - goto 语句

C 语言中的函数

C - 函数 C - Main 函数 C - 按值调用函数 C - 按引用调用函数 C - 嵌套函数 C - 可变参数函数 C - 用户定义函数 C - 回调函数 C - return 语句 C - 递归

C 语言中的作用域规则

C - 作用域规则 C - 静态变量 C - 全局变量

C 语言中的数组

C - 数组 C - 数组的属性 C - 多维数组 C - 将数组传递给函数 C - 从函数返回数组 C - 可变长度数组

C 语言中的指针

C - 指针 C - 指针和数组 C - 指针的应用 C - 指针运算 C - 指针数组 C - 指向指针的指针 C - 将指针传递给函数 C - 从函数返回指针 C - 函数指针 C - 指向数组的指针 C - 指向结构体的指针 C - 指针链 C - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 C - 预处理器操作符 C - 宏 C - 头文件

C 语言中的内存管理

C - 内存管理 C - 内存地址 C - 存储类

C 其他主题

C - 错误处理 C - 可变参数 C - 命令执行 C - 数学函数 C - static 静态关键字 C - 随机数生成 C - 命令行参数

C 语言编程资源

C语言问题与解答答案 C语言快速指南 C语言速查表 C语言实用资源 C语言讨论


C 语言中的字符串

C 语言中的字符串是一个 char 类型的一维数组,数组中的最后一个字符是一个"空字符",用 '\0' 表示。因此,C 语言中的字符串可以定义为以空字符结尾的 char 类型值序列。

在 C 语言中创建字符串

我们创建一个字符串"Hello"。它包含五个 char 值。在 C 语言中,char 类型的字面量表示使用单引号符号,例如 'H'。将这五个字母放在单引号中,后跟一个用 '\0' 表示的空字符,赋值给一个 char 类型数组。数组的大小为 5 个字符加上 6 个空字符。

示例

char greet[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

初始化字符串而不指定大小

C 语言允许初始化数组而不声明大小,在这种情况下,编译器会自动确定数组大小。

示例

char greet[] = {'H', 'e', 'l', 'l', 'o', '\0'};

在内存中创建的数组可以示意性地显示如下:

字符串表示

如果字符串不以"\0"结尾,则会导致不可预测的行为。

注意:字符串的长度不包括空字符。库函数 strlen() 返回此字符串的长度为 5。

循环遍历字符串

您可以使用 for 循环 或任何其他 循环语句 循环遍历字符串(字符数组),以访问和操作字符串中的每个字符。

示例

在下面的示例中,我们将打印字符串的字符。

#include <stdio.h>
#include <string.h>

int main (){

   char greeting[] = {'H', 'e', 'l', 'l', 'o', '\0'};

   for (int i = 0; i < 5; i++) {
      printf("%c", greeting[i]);
   }

   return 0;
}

输出

它将产生以下输出 -

Hello

打印字符串(使用 %s 格式说明符)

C 语言提供了一个格式说明符"%s",用于在使用 printf()fprintf() 等函数时打印字符串。

示例

"%s"说明符指示函数遍历数组,直到遇到空终止符 (\0) 并打印每个字符。这有效地打印了字符数组所表示的整个字符串,而无需使用循环。

#include <stdio.h>

int main (){

   char greeting[] = {'H', 'e', 'l', 'l', 'o', '\0'};
   printf("Greeting message: %s
", greeting );

   return 0;
}

输出

它将产生以下输出 -

Greeting message: Hello

您可以声明一个超大数组并分配较少的字符数,C 编译器 对此不会产生任何问题。但是,如果数组大小小于初始化时指定的字符数,则输出中可​​能会出现垃圾值。

char Greeting[3] = {'H', 'e', 'l', 'l', 'o', '\0'};
printf("%s", Greeting);

使用双引号构造字符串

C 语言允许您通过将字符括在双引号中来构造字符串,而不是像以前那样用单引号将单个 char 值组成一个 char 数组,并使用 "\0" 作为最后一个元素。这种初始化字符串的方法更方便,因为编译器会自动添加"\0"作为最后一个字符。

Example

#include <stdio.h>

int main() {
    // 创建字符串
    char Greeting[] = "Hello World";
    
    // 打印字符串
  	printf("%s
", greeting);

  return 0;
}

输出

它将产生以下输出 -

Hello World

使用 scanf() 输入字符串

如果要让用户输入字符串,声明一个以空字符结尾的字符串会比较困难。您可以借助 for 循环,一次接受一个字符并将其存储在数组的每个下标中 -

语法

for(i = 0; i < 6; i++){
   scanf("%c", &greeting[i]);
}
greeting[i] = '\0';

示例

在以下示例中,您可以使用 scanf() 函数 输入一个字符串。输入特定字符(以下示例中为 5 个)后,我们将赋值 null ('\0') 来终止该字符串。

printf("Starting Typing... ");

for (i = 0; i < 5; i++) {
    scanf("%c", &greeting[i]);
}

// 手动赋值 NULL
greeting[i] = '\0';

// 打印字符串
printf("Value of greeting: %s
", greeting);

输出

运行代码并检查其输出 −

Starting typing... Hello
Value of greeting: Hello

示例

无法输入"\0"(空字符串),因为它是不可打印的字符。为了解决这个问题,在 scanf() 语句中使用了"%s"格式说明符 -

#include <stdio.h>
#include <string.h>

int main (){

   char greeting[10];

   printf("Enter a string:
");
   scanf("%s", greeting);

   printf("You entered: 
");
   printf("%s", greeting);

   return 0;
}

输出

运行代码并检查其输出 −

Enter a string:
Hello
You entered:
Hello

注意:如果数组的大小小于输入字符串的长度,则可能会导致垃圾数据、数据损坏等情况。

包含空格的字符串输入

scanf("%s") 会读取字符,直到遇到空格(空格、制表符、换行符等)或 EOF。因此,如果您尝试输入一个包含多个单词(以空格分隔)的字符串,C 程序会接受第一个空格之前的字符作为字符串的输入。

示例

请看以下示例 -

#include <stdio.h>
#include <string.h>

int main (){

   char greeting[20];

   printf("Enter a string:
");
   scanf("%s", greeting);

   printf("You entered: 
");
   printf("%s", greeting);

   return 0;
}

输出

运行代码并检查其输出 −

Enter a string:
Hello World!

You entered:
Hello

使用 gets() 和 fgets() 函数进行字符串输入

要接受中间带有空格的字符串输入,我们应该使用 gets() 函数。它被称为非格式化控制台输入函数,定义在 stdio.h" 头文件 中。

示例:使用 gets() 函数进行字符串输入

请看以下示例 -

#include <stdio.h>
#include <string.h>

int main(){

   char name[20];

   printf("Enter a name:
");
   gets(name);

   printf("You entered: 
");
   printf("%s", name);

   return 0;
}

输出

运行代码并检查其输出 −

Enter a name:
Sachin Tendulkar

You entered: 
Sachin Tendulkar

在较新版本的 C 语言中,gets() 已被弃用。它是一个潜在的危险函数,因为它不执行边界检查,并且可能导致缓冲区溢出。

建议使用 fgets() 函数。

fgets(char arr[], size, stream);

fgets() 函数 可用于接受来自任何输入流的输入,例如 stdin(键盘)或 FILE(文件流)。

示例:使用 fgets() 函数进行字符串输入

以下程序使用 fgets() 并接受来自用户的多字输入。

#include <stdio.h>
#include <string.h>

int main(){

   char name[20];

   printf("Enter a name:
");
   fgets(name, sizeof(name), stdin);

   printf("You entered: 
");
   printf("%s", name);

   return 0;
}

输出

运行代码并检查其输出 −

Enter a name:
Virat Kohli

You entered: 
Virat Kohli

示例:使用 scanf("%[^ ]s") 输入字符串

您也可以使用 scanf("%[^ ]s") 作为替代方案。它会读取字符,直到遇到换行符 (" ")。

#include <stdio.h>
#include <string.h>

int main (){

   char name[20];

   printf("Enter a name: 
");
   scanf("%[^
]s", name);

   printf("You entered 
");
   printf("%s", name);

   return 0;
}

输出

运行代码并检查其输出 −

Enter a name: 
Zaheer Khan

You entered 
Zaheer Khan

使用 puts() 和 fputs() 函数打印字符串

我们一直在使用带有 %s 说明符的 printf() 函数 来打印字符串。我们也可以使用 puts() 函数(在 C11 和 C17 版本中已弃用)或 fputs() 函数 作为替代方案。

示例

请看以下示例 -

#include <stdio.h>
#include <string.h>

int main (){

   char name[20] = "Rakesh Sharma";

   printf("With puts(): 
");
   puts(name);

   printf("With fputs(): 
");
   fputs(name, stdout);

   return 0;
}

输出

运行代码并检查其输出 −

With puts(): 
Harbhajan Singh

With fputs(): 
Harbhajan Singh