字符串和格式化输入/输出:C语言中的文本处理艺术

LabVIEW数字转字符串的艺术:从基础到高级格式化技巧 本文深入探讨了LabVIEW中数字转字符串的核心技术与高级格式化技巧,包括格式化写入字符串函数、数值至十进制字符串函数等的应用场景和性能优化。通过实战案例和性能对比,帮助开发者掌握高效、精确的数据转换方法,提升工业自动化和测试测量领域的数据处理能力。 阅读详情

目录

引言

一、C语言中的字符串基础

1.1 字符串的本质

1.2 常见的字符串声明错误

1.3 字符串与字符指针

二、格式化输出函数printf

2.1 printf基本用法

2.2 常用格式说明符

2.3 高级格式化技巧

三、格式化输入函数scanf

3.1 scanf基本用法

3.2 scanf的安全问题与解决方案

3.3 scanf的返回值处理

四、字符串输入输出函数

4.1 gets与fgets

4.2 puts与fputs

五、sprintf和snprintf

5.1 sprintf的安全隐患

5.2 snprintf的安全用法

结语


🌈你好呀!我是 程序猿

🌌 2025感谢你的陪伴与支持 ~

🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!


引言

       在C语言编程中,字符串处理和格式化输入/输出是基础但极其重要的部分。无论是开发控制台应用程序、系统工具还是嵌入式软件,都离不开对文本数据的处理。本文将深入探讨C语言中的字符串概念、格式化输入输出函数的使用方法,以及相关的编码规范和最佳实践。

一、C语言中的字符串基础

1.1 字符串的本质

       在C语言中,字符串实际上是字符数组,以空字符'\0'作为结束标志。这种以null结尾的特性是C字符串处理函数工作的基础。

// 正确的字符串声明方式
char greeting1[] = "Hello, World!";  // 编译器自动计算大小并添加\0
char greeting2[14] = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\0'};

1.2 常见的字符串声明错误

       初学者常犯的错误包括忘记分配足够的空间或遗漏终止符:

// 错误的字符串声明示例
char error1[5] = "Hello";  // 空间不足,缺少\0的位置
char error2[] = {'H', 'i'}; // 缺少终止符\0

1.3 字符串与字符指针

       字符指针也可以用来处理字符串,但需要注意内存管理:

// 字符串指针的使用
const char *ptr1 = "This is a string literal";  // 指向字符串常量
char arr[] = "Modifiable string";
char *ptr2 = arr;  // 指向可修改的字符串

二、格式化输出函数printf

2.1 printf基本用法

       printf是C语言中最常用的输出函数,其原型为:

int printf(const char *format, ...);

       使用示例:

#include <stdio.h>

int main() {
    int age = 25;
    float height = 1.75f;
    char *name = "Alice";
    
    printf("Name: %s\n", name);
    printf("Age: %d, Height: %.2f meters\n", age, height);
    
    return 0;
}

2.2 常用格式说明符

说明符用途示例
%d十进制整数printf("%d", 10)
%f浮点数printf("%.2f", 3.14159)
%c单个字符printf("%c", 'A')
%s字符串printf("%s", "hello")
%x十六进制整数printf("%x", 255)
%p指针地址printf("%p", &var)
%%百分号字符printf("%%")

2.3 高级格式化技巧

#include <stdio.h>

int main() {
    // 控制字段宽度和对齐
    printf("|%10s|\n", "Hello");    // 右对齐,宽度10
    printf("|%-10s|\n", "Hello");   // 左对齐,宽度10
    
    // 填充字符
    printf("%05d\n", 42);           // 输出00042
    
    // 科学计数法表示
    printf("%.3e\n", 12345.6789);   // 输出1.235e+04
    
    return 0;
}

三、格式化输入函数scanf

3.1 scanf基本用法

       scanf用于从标准输入读取格式化数据,其原型为:

int scanf(const char *format, ...);

使用示例:

#include <stdio.h>

int main() {
    int age;
    float height;
    char name[50];
    
    printf("Enter your name, age and height: ");
    scanf("%49s %d %f", name, &age, &height);
    
    printf("Name: %s\nAge: %d\nHeight: %.2f\n", name, age, height);
    
    return 0;
}

3.2 scanf的安全问题与解决方案

       scanf存在缓冲区溢出的风险,应当始终指定最大读取长度:

// 不安全的用法
char buffer[20];
scanf("%s", buffer);  // 可能溢出

// 安全的用法
scanf("%19s", buffer); // 最多读取19个字符+1个\0

3.3 scanf的返回值处理

       scanf返回成功读取的项数,应始终检查返回值:

int items_read;
while ((items_read = scanf("%d %f", &num, &value)) != 2) {
    printf("Invalid input. Please try again.\n");
    // 清空输入缓冲区
    while (getchar() != '\n');
}

四、字符串输入输出函数

4.1 gets与fgets

       gets函数用于从标准输入(stdin)读取一行字符串,其函数原型为

char *gets(char *str);

       gets函数存在严重的安全隐患,因为它无法限制读取的字符数量。

特点:

  1. 缓冲区溢出风险:如果用户输入的数据比目标缓冲区大,gets会继续写入内存,导致缓冲区溢出

  2. 无长度检查:它不知道目标缓冲区的大小,会一直读取直到遇到换行符或EOF

  3. 已被C11标准废弃:现代C标准中已移除此函数

使用示例:

char name[10];  // 只能容纳9个字符+1个\0
gets(name);     // 如果用户输入超过9个字符就会溢出

       gets函数极其危险,fgets是gets的安全替代品,其函数原型为:

char *fgets(char *str, int n, FILE *stream);
/* 参数说明:

* str:存储输入的字符数组

* n:最大读取字符数(包括结尾的null字符)

* stream:输入流(通常用stdin表示标准输入)
*/

特点:

  1. 安全性:可以指定最大读取长度,防止缓冲区溢出

  2. 保留换行符:如果读取的行中包含换行符,fgets会将其保留在字符串中

  3. 通用性:不仅可以从标准输入读取,也可以从任何文件流读取

使用示例:

#include <stdio.h>

int main() {
    char buffer[100];
    printf("Enter a string: ");
    fgets(buffer, sizeof(buffer), stdin);  // 安全读取
    printf("You entered: %s\n", buffer);
    return 0;
}

4.2 puts与fputs

       puts函数用于向标准输出(stdout)输出字符串,并自动添加换行符,其函数原型为:

int puts(const char *str);

特点:

  1. 自动添加换行符:在输出字符串后会自动添加\n

  2. 只输出到stdout:不能指定其他输出流

  3. 参数为字符串指针:接受以null结尾的字符串

  4. 返回值:成功返回非负值,失败返回EOF

使用示例:

#include <stdio.h>

int main() {
    const char *message = "Hello, World!";
    puts(message);  // 输出字符串并自动换行
    puts("This is another line."); // 再次输出并换行
    return 0;
}
输出结果:
Hello, World!
This is another line.

       fputs是puts的通用版本,可以向任意输出流写入字符串,其函数原型为:

int fputs(const char *str, FILE *stream);

参数说明:

  • str:要输出的字符串

  • stream:输出流(如stdout、文件指针等)

特点

  1. 不自动添加换行符:需要手动添加\n
  2. 输出流灵活:可以输出到文件、标准输出、标准错误等
  3. 效率较高:适合大量数据的连续输出
  4. 返回值:成功返回非负值,失败返回EOF

使用示例:

#include <stdio.h>

int main() {
    const char *message = "Hello, fputs!";
    
    // 输出到标准输出
    fputs(message, stdout);
    fputs("\n", stdout);  // 需要手动添加换行
    
    // 输出到文件
    FILE *fp = fopen("output.txt", "w");
    if (fp != NULL) {
        fputs(message, fp);
        fputs("\n", fp);  // 文件输出也需要手动换行
        fclose(fp);
    }
    
    return 0;
}

五、sprintf和snprintf

5.1 sprintf的安全隐患

       sprintf函数用于将格式化的数据写入字符串缓冲区,其函数原型为:

int sprintf(char *str, const char *format, ...);

特点:

  1. 格式化功能强大:支持所有printf风格的格式化

  2. 不检查缓冲区大小:可能导致缓冲区溢出

  3. 返回写入字符数:不包括终止null字符

  4. 目标缓冲区需足够大:程序员需自行确保

使用示例:

#include <stdio.h>

int main() {
    char buffer[100];
    int number = 42;
    float pi = 3.14159f;
    
    sprintf(buffer, "数字是%d, 圆周率约等于%.2f", number, pi);
    puts(buffer);
    
    return 0;
}

输出结果:

数字是42, 圆周率约等于3.14

安全隐患:

char small_buf[10];
int large_num = 1234567890;

// 危险:可能导致缓冲区溢出
sprintf(small_buf, "%d", large_num);

5.2 snprintf的安全用法

       snprintf是sprintf的安全版本,增加了缓冲区大小参数,其函数原型为:

int snprintf(char *str, size_t size, const char *format, ...);

特点:

  1. 缓冲区大小限制:防止溢出

  2. 保证null终止:只要size > 0

  3. 返回值有意义:返回欲写入的字符数(不包括null)

  4. 截断检测:若返回值 >= size,表示被截断

使用示例:

#include <stdio.h>

int main() {
    char buffer[20];
    int number = 12345;
    
    snprintf(buffer, sizeof(buffer), "数字是%d", number);
    puts(buffer);
    
    return 0;
}

输出结果:

数字是12345

结语

       字符串处理和格式化输入输出是C语言编程的基础,也是许多安全问题的源头。通过遵循本文介绍的编码规范和最佳实践,可以编写出更安全、更健壮的代码。记住,良好的编程习惯不仅关乎代码的功能实现,更关系到程序的安全性和可维护性。


  ​期待批评指正,共同进步~

11、探索C语言中的转义序列:掌握格式化输出的艺术 本文深入探讨了C语言中的转义序列,包括常见转义字符的使用方法及其在格式化输出、文件读写、网络通信等场景中的应用。通过示例代码和详细解析,帮助读者掌握如何利用转义序列优化程序输出并提升编程效率。 阅读详情

相关推荐

掌握C语言输入输出操作的艺术

本文深入探讨了C语言中输入和输出操作的核心技巧,包括字符和字符串的打印、混合数据类型的输出以及如何增强输出的可读性。通过具体的程序示例和输出格式化技巧,展示了如何在C语言中优雅地处理数据的输入输出,以及如何优化输出结果的可读性,帮助程序员更高效地编写代码。

weixin_29097457的博客 236

printf输出格式总结

1) 整数%d  整数的参数会被转成有符号的十进制数字%u  整数的参数会被转成无符号的十进制数字%o  整数的参数会被转成无符号的八进制数字%x  整数的参数会被转成无符号的十六进制数字,并以小写abcdef 表示%X  整数的参数会被转成无符号的十六进制数字,并以大写ABCDEF 表示浮点型数%f double  型的参数会被转成十进制数字,并取到小数点以下六位,四舍五入%e double  ...

Wsaka的博客 1186

掌握C语言中的scanf函数以实现键盘输入

本文还有配套的精品资源,点击获取 简介: scanf 是 C 语言中的一个核心标准输入函数,用于从键盘读取用户输入的数据,并根据提供的格式化字符串进行解析。通过学习 scanf 的语法、优缺点以及其在不同场景下的应用,可以帮助编程者有效地处理各种输入情况。文章将通过示例代码来展示如何利用 scanf 获取用户输入,并计算三角数作为实...

weixin_42627459的博客 831

c语言 字符串 格式化

wu

积累与备忘 3424

Tessent_StdcellLib

第二种为 Tessent Cell lib,既可用于功能仿真,也可以用于测试逻辑插入。lib包含了用于仿真的功能信息,也包含DFT cell属性。如何使用tessent工具将stdcell verilog 仿真模型转换为tessent自己的lib。运行后工具会生成一个atpg的lib文件,打开文件,找到一个带SI的DFF,只有功能描述。tessnt lib分为两种,第一种为ATBG lib,可以用于仿真;打开生成的lib文件,多了dft_cell_selection。第二部:编写attributes文件。

qq_40411444的博客 2134

告别手动标注!PDMS NakiToolkit插件安装与初体验:以Pipeline工具为例

本文详细介绍了PDMS NakiToolkit插件的安装与使用,特别是其Pipeline工具如何通过自动化标注和材料统计功能大幅提升三维工厂设计效率。从环境准备到实战演示,帮助工程师告别繁琐的手动标注工作,实现项目交付周期的大幅缩短。

weixin_30047059的博客 350

C语言如何格式化字符串

在C语言中,使用printf函数进行输出时,可以在输出字符串中加入一些格式控制符,从而实现对输出格式的控制。其中,format string是格式化字符串, argument1, argument2, …在C语言中,通过使用printf函数来格式化输出字符串。precision:输出精度,是一个非负整数,表示小数部分的位数。width:输出宽度,是一个非负整数,表示输出的最小宽度。specifier:转换说明符,必须有,表示输出的类型。length:长度修饰符,可以有零个或一个。

学无止尽,谨言慎行! 3516

AI代码标注专家Prompt指令的最佳实践

AI代码标注专家 Prompt 可作为项目级别提示词使用,专门负责为 AI 生成的代码添加特定的注释标记,然后基于 Node 脚本可以初步统计出 AI 代码占比。

💻 Code:TypeScript / Engineering 🤖 AI:Prompt Optimization / Context Memory / Coding Agents 614

09-C语言格式化字符串操作

代码演示// 50return 0;别名定义步骤:int num;;。代码演示*p = 10;案例:下面代码p1,p2和p3,p4有什么区别int// 宏替换相当于:int *p1, p2;// 起别名,将int * 看成一个整体,相当于:int *p3, *p4return 0;答案:p1是指针变量,类型为int *;p2是普通变量,类型为int;p3,p4都是指针变量,类型为int *。

qq_63958145的博客 2447

jmeter小白下载安装步骤

本文仅仅简单介绍了jmeter工具的下载安装,以及基础的操作步骤。

昔年@曦的博客 3492

银行监管报送系统系列介绍(二十一):银行监管报送系统总览

为保护法院案件当事人、利害关系人的合法权益,全面落实《最高人民法院、中国银行业监督管理委员会关于人民法院与银行业金融机构开展网络执行查控和联合信用惩戒工作的意见》(法【2014】266号),最高人民法院和银监会联合下发了《人民法院、银行业金融机构网络执行查控工作规范》(法【2015】321号),要求银行金融机构配合最高人民法院开展 “总对总”网络执行查控工作,并建立相应的业务系统,实现与法院的网络对接,协助法院完成对被执行人银行账户存款及其他金融资金的网络查询、冻结与扣划工作。

银行信息系统应用架构详解 2863

【C语言】格式化字符串printf()、sprintf()、scanf()、sscanf()函数详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

xiaoxiaoguailou的博客 3215

图神经网络实战(2)——图论基础

图论 (Graph theory) 是数学的一个基本分支,涉及对图研究。图是复杂数据结构的可视化表示,有助于理解不同实体之间的关系。图论提供了大量建模和分析现实问题的工具,如交通系统、社交网络和互联网等。在本节中,将介绍图论的基本原理,主要涉及三个方面:图属性、图概念和图算法。

盼小辉丶的博客 1万+

C语言中的输入输出艺术:深入解析puts/printf与gets/scanf

在C语言编程中,输入输出操作是构建程序与用户交互的基石。puts()和printf()作为标准输出函数,而gets()(尽管已不推荐使用)和scanf()作为标准输入函数,它们共同构成了C语言程序中不可或缺的一部分。本文将深入探讨这些函数的工作原理、使用场景、性能考量、安全性问题以及在现代编程实践中的最佳实践,同时扩展讨论到fgets()和sscanf()等更安全的替代方案。

星途码客的博客 1994

openssl命令数据摘要详解(SM3、sha256、MD5、dss1、mdc2、ripemd160)

SM3是由中国密码学家设计的密码哈希函数,是中国国家密码管理局(National Cryptographic Authority,简称:CNCA)颁布的国家密码算法标准。SM3属于密码杂凑函数家族,它可以计算任意长度的消息并生成固定长度(256比特,即32字节)的哈希值。SM3生成的哈希值长度为256比特(32字节),不管输入消息的长度如何,输出始终是固定的。SM3将输入数据划分为512比特(64字节)的分组,并对每个分组进行处理。

N阶二进制的博客 4460

大数据领域数据产品的团队激励与绩效管理

在大数据领域,数据产品的成功离不开高效协作的团队。团队激励与绩效管理的目的在于激发团队成员的工作热情和创造力,提高工作效率和质量,确保数据产品能够按时、高质量地交付。本文章的范围涵盖了大数据领域数据产品团队激励与绩效管理的各个方面,包括激励机制的设计、绩效评估的方法、团队沟通与协作等。本文将按照以下结构进行阐述:首先介绍核心概念与联系,明确相关概念的定义和相互关系;接着讲解核心算法原理和具体操作步骤,为团队激励与绩效管理提供理论支持和实践指导;然后分析数学模型和公式,帮助读者深入理解绩效评估的原理;

Java大师兄的博客 1018

【C语言】printf 的使用:格式化输出的艺术

​系列文章目录第一章 C语言学习入门之printf的使用前言在C语言编程中, printf 函数是输出数据到标准输出流(通常是屏幕)的常用方法。它功能强大,灵活多变,能够满足各种格式化输出的需求。本文将详细介绍 printf 函数的使用方法和一些实用的技巧。

ajiasha1的博客 1122

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

初识C语言之数据输入输出篇——带你领略编程世界的文字艺术!

目录 语句 字符数据输入输出 字符数据输出 字符数据输入 字符串输入输出 字符串输出函数 字符串输入函数 ​ 格式输出函数 格式输入函数 顺序程序设计应用 语句 C语言的语句用来向计算机系统发出操作指令。一条语句编写完成经过编译后产生若干条机器指令。实际程序中包含若干条语句,因此语句的作用就是完成一定的操作任务。 字符数据输入输出 字符数据输出 字符数据输出使用的是putchar函数,作用是向显示设备输出一个字符。该函数的定义为: int putchar( int ch )

迷茫与徘徊只会让你陷入绝境,欢迎私信博主,带你开始提升变现价值! 2854

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【轻松学C:编程小白的大冒险】— 11 基础输入输出函数与格式化

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 805

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

printf的七十二变:C语言格式化输出的创意实践

本文深入探讨了C语言中`printf`函数的创意应用,从基础格式化输出到高级图形和动画效果。通过EDUCoder平台的编程练习示例,展示了如何利用`printf`实现ASCII艺术、动态进度条和简单游戏开发,为C语言学习者提供了丰富的实践技巧和调试方法。

pca5navigator的博客 560

从0开始学习C++:C/C++ 输入输出全攻略

在 C/C++ 的世界里,。无论你是刚接触编程的新手,还是备战算法竞赛的选手,熟练掌握和cin/cout,不仅能避免“样例能过,提交 WA”的尴尬,还能在关键时刻提升运行效率。本文将带你系统掌握 C/C++ 输入输出的核心技能。

2509_93923299的博客 691

1.数据,运算符和输入输出【由浅入深.c】

本文介绍数据类型和变数据,运算符和输入输出相关内容。

插花弄玉的博客 1224

从0开始学习C++:C/C++ 输入输出

在 C/C++ 的世界里,。无论你是刚接触编程的新手,还是备战算法竞赛的选手,熟练掌握和cin/cout,不仅能避免“样例能过,提交 WA”的尴尬,还能在关键时刻提升运行效率。本文将带你系统掌握 C/C++ 输入输出的核心技能。

2501_94114815的博客 764

Python字符串格式化(一):三种经典格式化方法

在Python编程中,字符串格式化是一项常用的操作,它能让我们以更灵活、更美观的方式展示数据。Python提供了三种主要的字符串格式化方法,分别是`% operator`、`string.format()`和`f-string`,它们在不同的Python版本中引入,每一代都承载着语言设计哲学的进化。本文将深入剖析三种格式化方法的技术细节、适用场景及最佳实践,帮助开发者根据需求选择最优方案。

dudly的博客 3031

C语言数据类型与标准输入输出详解

深入讲解C语言中的基本数据类型,包括char、int、float、double等及其占位符使用,介绍sizeof运算符和scanf函数的正确用法,并通过实例帮助理解数据存储与类型转换。

weixin_31486261的博客 944
上一篇: MCU开发中的SYS与SOC:概念解析与区别
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿!=程序员

感谢来过,感谢有你!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值