再学C语言45:字符串输入
创始人
2025-05-29 15:41:15

若需把一个字符串读到程序中,首先预留存储字符串的空间,然后使用输入函数获取该字符串

一、创建存储空间

计算机不会先计算字符串长度,然后再为字符串分配空间

如果使用代码:

char *str;
scanf("%s", str);

则在读入str的时候,str会覆盖程序中的已有数据和代码,可能导致程序异常终止,因为在获取字符串之前,虽然进行了声明,但是并没有初始化为其分配存储空间,str可能指向任何可能的位置

最简单的方法是在声明的同时明确指出数组的大小:

char str[80];

另一种方法是使用C库中分配存储空间的函数


为字符串预留空间之后,可以读取字符串,C库提供了3个读取字符串的函数:scanf()、gets()、fgets()

二、gets()函数

gets()函数:get string,从系统的标准输入设备(通常是键盘)获得一个字符串

因为字符串没有预定的长度,所以gets()函数需要知道何时结束读取

解决办法:读字符串直到遇到一个换行字符(\n),按回车键可以产生该字符

gets()函数读取换行字符之前(不包括换行字符)的所有字符,并在这些字符后添加一个空字符(\0),然后把这个字符串交给调用它的程序

gets()函数将读取换行字符并将其丢弃,保证下次读取会在新的一行开始

示例代码:

#include int main(void)
{char name[100]; // 分配空间printf("I need a name:\n");gets(name); // 使用gets()函数从键盘获得字符串printf("%s is a nice name.\n", name); // 显示,确认读取数据return 0;
}

运行结果:

2a3b220cb7c94a2397fc4d5c572a4125.png

gets()函数通过两种方式获得输入:

1)使用一个地址把字符串赋予数组

2)使用return关键字返回字符串地址

/* 将gets()函数的返回值分配给指针 */
#include int main(void)
{char name[100]; // 分配空间char * p;printf("I need a name:\n");p = gets(name); // 使用gets()函数从键盘获得字符串printf("%s is a nice name.\n", p); // 显示,确认读取数据return 0;
}

gets()的函数原型已经在stdio.h中声明,其返回值是一个指向char的指针

char *gets(char *s)
{...return (s);
}

实际gets()函数还需要考虑加入一些错误检测环节

// gets()和getchar()的用法
while(gets(name) != NULL)
while((ch = getchar()) != EOF)

不要混淆空指针和空字符:

空指针是一个地址

空字符是一个char类型的数据对象,其值为0

数值上空指针和空字符都可以用0表示,但是概念不同:NULL是一个指针,而0是一个char类型的常量

 

相关内容

热门资讯

Python爬虫——Pytho... JSON(JavaScript Object Notation)是一种轻...
Spring Boot 3.0... 有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.3 源码地址:ht...
KANO模型(卡诺模型):产品... 在做项目做产品的过程中,作为互联网产品设计师的我们,经常会接到来自PM/...
连载一:go安装和配置环境变量 go语言标准库地址:Go语言标准库文档中文版 | Go语言中文网 | Golang中文...
手把手教你基于HTML、CSS... The sand accumulates to form a pagoda写在前面HTML是什么&#...
字节测试工程师悄悄告诉我的软件... 目录 前言 测试策略的关注重点 测试策略主要内容 总体测试策略 初级版本测试策略 跟踪测试执行 版本...
STM32学习(五) GPIO General Purpose Input Output,通用输入输出端口&...
开发还分前、后端?它们都是做什... 开发还分前、后端?它们都是做什么的? 2023-03-20 14:54·...
Nordic nRF5 mes... nRF5 mesh蓝牙组网软件SDK下载链接: NordicSemiconductor...
【uniapp tabs标签组... 前言 这个tabs功能是很多移动端项目都要用的 最近我刚好遇到了这个功能 因为我们项目不让用uvie...
电子采购管理软件开发功能有哪些... 电子采购系统是将供应商、招标机构、评标专家、政府监督机构等连接起来,企业、机关和个人在...
K8S集群1.24使用dock... 文章目录1. 环境介绍2. 异常信息3. 分析问题3.1 kubernetes 健康检查3.1.1 ...
TS接口类型 40. TS接口 1. 定义 TypeScript 中的接口是一种抽象结构,用于定义对...
Time out. EFI N... 背景:最近使用了虚拟机,正准备安装个Windows10的操作系统...
数字电路2. OC门、OD门、... 数字电路2. OC门、OD门、三态门一、OC门——集电集开路门1. 基本概念2. 作用3. 使用要点...
操作系统性能优化实践 感谢内容提供者:四川省奇呱科技有限公司 文章目录一、常见性能指标及USE法分类1.C...
展现AI与自动化测试技术之间的... 目录:导读 前言 一、介绍 1、什么是自动化测试技术 2、痛点 3、几款优秀的自动化测...
第一周web 目录 [NISACTF 2022]popchains  [NSSCTF 2022 Spring Re...
百元降噪耳机推荐,适合学生党入... ​降噪蓝牙耳机怎么选?有哪些适合学生党使用的百元降噪蓝牙耳机?很多人在面...
C# winform坐标系类型... C# winform坐标系类型详解 GDI+ 使用三个坐标空间:世界、页面和设...
Windows平台安装MacO... 写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自...
Windos远程连接Linux... ssh安装 使用root用户登录 su root 更换apt 下载源为清华源,先备...
近期媒体邀约活动总结,注意事项 传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 随...
每日一博 - Java 异步编... 文章目录概述概述Executor与线程池Java 中的线程池使用线程池的注意事项强烈建议使用有界队列...
thinkphp基础学习 Composer安装thinkphp6,输入命令,其中tp为项目目录名可...
10从零开始学Java之开发J... 作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦CSD...
项目团队任务分配的5大注意事项         想要把工作合理分配给下属,在进行项目团队任务分配时,需要...
scratch猜数字游戏 电子... 目录 scratch猜数字游戏 一、题目要求 1、准备工作 2、功能实现 二、案例分析 <
Windows逆向安全(一)之... C语言内联汇编和调用协定 前面我们通过分析反汇编分析了C语言,现在我们来探究如何在C语...
「操作系统」什么是用户态和内核... 「操作系统」什么是用户态和内核态?为什么要区分 参考&鸣谢 从根上理解用户态与内核态...