C语言中用指针输入字符串

参考文章

在C语言中,使用指针输入字符串的核心观点有:利用指针指向字符数组、使用标准输入函数如scanf和gets、使用动态内存分配函数如malloc。 其中,利用指针指向字符数组是最常见且基础的方法,下面将对此进行详细描述。

利用指针指向字符数组,首先需要定义一个字符数组并用指针指向它。然后,通过标准输入函数读取输入字符串并存储在数组中。比如使用scanf函数,可以将输入的字符串存储在字符数组中,通过指针访问和操作该数组中的内容。

一、定义字符数组并利用指针

在C语言中,字符数组是存储字符串的基础数据结构。定义一个字符数组,并用指针指向它,可以方便地进行字符串输入和操作。
Micorsoft Visual Stdio Community 2022中测试会引发异常

c 复制代码
#include <stdio.h>

int main() 
{
	char str[100]; // 定义字符数组
	char* ptr = str; // 定义指针并指向字符数组
	scanf_s("%s", ptr); // 使用指针输入字符串
	printf("%s", ptr); // 使用指针输出字符串
	return 0;
}

在上述代码中,定义了一个字符数组str和一个指向str的指针ptr。通过scanf函数读取用户输入的字符串并存储在字符数组中,最后通过指针输出字符串。

二、使用标准输入函数

C语言提供了多种标准输入函数用于读取字符串,常见的有scanf、gets和fgets。

1、scanf函数

scanf函数用于读取格式化输入。通过格式控制符%s可以读取字符串,存储在指定的字符数组中。
代码同上

需要注意的是,scanf函数会以空白字符(空格、制表符、换行符等)作为分隔符,只能读取一个单词。如果需要读取包含空格的字符串,可以使用gets或fgets函数。

2、gets函数

gets函数用于读取一行输入,包括空格在内,直到遇到换行符为止。读取的字符串存储在指定的字符数组中。

c 复制代码
#include <stdio.h>
#include<string.h>

int main() {
char str[100];
char* ptr = str;
gets(ptr);
printf("%s,%d", ptr,strlen(ptr)); //字符串长度不含"\0"
return 0;
}

需要注意的是,gets函数不安全,可能导致缓冲区溢出,建议使用更安全的fgets函数。

3、fgets函数

fgets函数用于从标准输入读取指定长度的字符串,存储在指定的字符数组中。它不仅可以读取包含空格的字符串,还能防止缓冲区溢出。

c 复制代码
#include <stdio.h>
#include<string.h>

int main() {
char str[100];
char* ptr = str;
fgets(ptr, sizeof(str), stdin);
printf("%s,%d", ptr,strlen(ptr)); //字符串长度含"\0"
return 0;
}

C语言中字符串输入的三种方法区别

1.scanf("%s",s);

  • sacnf():当遇到从键盘输入空白字符(空格、换行符、制表符和空行)都标志输入结束,但要注意的是这些空白字符并没有被读入到字符串中也没有丢弃,而是等待下一个输入函数读取。当scanf函数gets()和fgets()混用的话,可能产生一些不一样的结果。

2.gets(s);

  • gets():可以接受一切字符,即输入空格、换行符什么的都可以读到字符串中。当在键盘上敲回车则表示输入结束,与scanf函数不同的是,换行符也会被读入。但是在使用gets()函数时,要注意输入字符的个数,不能超过字符串的大小限制。

3.fgets(s,size,stdin);

  • fgets():是为了解决gets()函数容易导致缓冲器溢出的问题来代替gets()函数。
    s:表示字符串
    size::输入字符的个数限制(其中要留一个给'\0')
    stdin:标准输入模式(即从键盘输入),fgets()函数还可以从文本中读入。
    当遇到换行符表示输入结束,分为两种情况:
    1.如果输入的字符个数没有超过size-1,然后敲回车结束,fgets()会把换行符也输入到字符串中 。
    2.如果输入字符超过size-1,然后敲回车结束,fgets()会截取size-1个字符输入字符串中,剩下的等待下一个输入函数读取。
相关推荐
知识分享小能手9 小时前
C学习教程,从入门到精通,C语言文件 — 完整知识点详解(14)
c语言·网络·学习
羊羊一洋10 小时前
ROM&RAM
c语言·stm32·学习
库玛西11 小时前
外部排序全解析:败者树、置换-选择排序与最佳归并树
c语言·数据结构·c++·笔记·考研·算法
潜创微科技13 小时前
CH591:成本优化的青稞 RISC-V 无线 MCU
c语言·单片机·risc-v·低延迟·沁恒·青稞
番茄灭世神14 小时前
PN学堂GD32课程第15篇——HardFault异常
c语言·单片机·嵌入式
吠品14 小时前
Flutter 工程配本地 Maven 引 AAR,仓库声明为啥不生效
c语言·人工智能·算法
en.en..16 小时前
volatile 完整深度教程(C 代码 + 带注释 ARM 汇编 + 硬件中断原理 + 分步运行时序)
c语言·汇编·arm开发
inrichtt16 小时前
第十课时:中断优先级揭秘:抢占与嵌套的底层逻辑:
c语言·stm32·单片机·嵌入式硬件·github
学逆向的17 小时前
C printf原型解析
c语言·开发语言·网络安全
BeiGuTing_code17 小时前
C字符输出:一个换行符引发的“失踪案”
c语言·开发语言