- 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语言 - 主函数
- 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语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组的区别
- C语言 - 字符指针和函数
- C语言 - 空指针
- C语言 - void指针
- C语言 - 悬空指针
- C语言 - 解引用指针
- C语言 - 近指针、远指针和巨大指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组的区别
- C语言字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点(.)运算符
- C语言 - 枚举 (enum)
- C语言 - 结构体填充和打包
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - typedef
- C语言中的文件处理
- C语言 - 输入输出
- C语言 - 文件I/O(文件处理)
- C语言预处理器
- C语言 - 预处理器
- C语言 - 预处理指令
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类别
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C编程资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
C语言字符串
C语言字符串
C语言中的字符串是由字符型数据组成的一维数组,数组的最后一个字符是“空字符”,用'\0'表示。因此,C语言中的字符串可以定义为以空字符结尾的字符型值序列。
在C语言中创建字符串
让我们创建一个字符串“Hello”。它包含五个字符型值。在C语言中,字符型的字面量表示使用单引号——例如'H'。这五个字母用单引号括起来,后面跟着一个用'\0'表示的空字符,并赋值给一个字符型数组。数组的大小是五个字符加一个空字符——六个。
示例
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
不指定大小初始化字符串
C语言允许您在不声明大小的情况下初始化数组,在这种情况下,编译器会自动确定数组的大小。
示例
char greeting[] = {'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\n", greeting );
return 0;
}
输出
它将产生以下输出:
Greeting message: Hello
您可以声明一个超大的数组并赋值较少的字符,C编译器对此没有问题。但是,如果大小小于初始化中的字符数,则输出中可能会出现垃圾值。
char greeting[3] = {'H', 'e', 'l', 'l', 'o', '\0'};
printf("%s", greeting);
使用双引号构造字符串
与其构造单个字符值用单引号括起来的char数组,并使用“\0”作为最后一个元素,C语言允许您通过将字符用双引号括起来来构造字符串。这种初始化字符串的方法更方便,因为编译器会自动添加“\0”作为最后一个字符。
示例
#include <stdio.h>
int main() {
// Creating string
char greeting[] = "Hello World";
// Printing string
printf("%s\n", greeting);
return 0;
}
输出
它将产生以下输出:
Hello World
使用scanf()输入字符串
声明以空字符结尾的字符串,如果您想要求用户输入字符串,则会造成困难。您可以借助for循环,一次接受一个字符并将其存储在数组的每个下标中:
语法
for(i = 0; i < 6; i++){
scanf("%c", &greeting[i]);
}
greeting[i] = '\0';
示例
在下面的示例中,您可以使用scanf()函数输入字符串,在输入特定字符(下面的示例中为5个)后,我们分配空值('\0')以终止字符串。
printf("Starting typing... ");
for (i = 0; i < 5; i++) {
scanf("%c", &greeting[i]);
}
// Assign NULL manually
greeting[i] = '\0';
// Printing the string
printf("Value of greeting: %s\n", 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:\n");
scanf("%s", greeting);
printf("You entered: \n");
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:\n");
scanf("%s", greeting);
printf("You entered: \n");
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:\n");
gets(name);
printf("You entered: \n");
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:\n");
fgets(name, sizeof(name), stdin);
printf("You entered: \n");
printf("%s", name);
return 0;
}
输出
运行代码并检查其输出:
Enter a name: Virat Kohli You entered: Virat Kohli
示例:使用scanf("%[^\n]s")输入字符串
您也可以使用scanf("%[^\n]s")作为替代方案。它读取字符,直到遇到换行符("\n")。
#include <stdio.h>
#include <string.h>
int main (){
char name[20];
printf("Enter a name: \n");
scanf("%[^\n]s", name);
printf("You entered \n");
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(): \n");
puts(name);
printf("With fputs(): \n");
fputs(name, stdout);
return 0;
}
输出
运行代码并检查其输出:
With puts(): Harbhajan Singh With fputs(): Harbhajan Singh