C语言中的字符串输入(gets_s、fgets、scanf、fscanf)与相关内存分配知识

这篇具有很好参考价值的文章主要介绍了C语言中的字符串输入(gets_s、fgets、scanf、fscanf)与相关内存分配知识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0. C语言的内存分配知识

分配内存空间有两种方式:静态内存分配和动态内存分配

0.1 静态内存分配

指的是在编译时确定数组等数据类型的大小,然后由计算机分配好,通常是存在栈上的数据

例如:在声明数组时,需要显示的指明数组的大小

char name[81]; // 一个大小为81bytes的字符数组
0.2 动态内存分配

通俗一点就是向计算机要内存空间,由程序员自由支配,同时程序员也负责释放。执行到相应的程序段时才会去申请内存,而不是像静态内存分配一样提前申请好。

通常使用malloccalloc等内存申请函数

#include<stdlib.h>
void* malloc(size_t size);
// https://www.runoob.com/cprogramming/c-function-calloc.html
void* calloc(size_t nitems, size_t size);
// 申请失败时返回NULL

与申请内存空间相对应的就是释放内存空间,通常使用free函数

//释放之前调用 calloc、malloc 或 realloc 所分配的内存空间
//https://www.runoob.com/cprogramming/c-function-free.html
void free(void *ptr)

1.gets_s()

char *gets_s( char *str, rsize_t n );// (C11 起)

功能:该函数表示从stdin(可以理解为从控制台输入)读取字符直到发现换行符\n或出现文件尾EOF

特点:注意该函数会放弃换行符\n

注意:最多可以写入n-1个字符到str所指向的数组,并在读取完后写入空终止字符' '(也即是第n个字符).

因此可以知道,gets_s函数读入的是一个C风格的字符串

返回值:成功时返回str,失败时返回NULL

用例:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char* str = malloc(10);
    if(str)
        gets_s(str, 10);
    printf("%s\n", str);
    return 0;
}
// VS2019中gets_s函数可执行 但是在Linux中无法编译

结果:
C语言中的字符串输入(gets_s、fgets、scanf、fscanf)与相关内存分配知识,c语言,开发语言
C语言中的字符串输入(gets_s、fgets、scanf、fscanf)与相关内存分配知识,c语言,开发语言

原因是:

微软实现了该函数,但是GCC没有实现该函数,详细原因未知。

本人创建的问题链接

2.fgets( )

char *fgets( char *restrict str, int count, FILE *restrict stream );

功能:该函数表示从一个文件流stream中,读取最多count-1个字符,并将读到的字符存储到str所指向的空间中,当函数读取字符遇到EOF或换行符\n时结束读取;

特点:如果是读取到换行符\n导致的结束读取,该函数将会把换行符\n一并存入str所指向的空间中,(这是和gets_s()函数的一大区别,gets_s()函数会抛弃换行符\n

注意:如果读取数据且没有发生错误,将会在紧随读入的字符数据后写入空终止字符' '

返回值:成功时返回str,失败时返回NULL

用例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *str = malloc(10);
    if (str)
        fgets(str, 10, stdin); // 表示从控制台输入
    printf("%s\n", str);
    free(str);
    return 0;
}

结果:
C语言中的字符串输入(gets_s、fgets、scanf、fscanf)与相关内存分配知识,c语言,开发语言

该函数在Linux和Win的VS中均可用

3.scanf()、fscanf()

int scanf( const char *restrict format, ... );// 从stdin格式化的读取数据
int fscanf( FILE *restrict stream, const char *restrict format, ... );// 从某个文件流stream格式化的读取数据

scanf()fscanf()函数确定字符串末尾(也即读取结束)的方法是:

①从非空白开始直至遇到第一个空白字符(包括空行、空格、制表符、换行符)

②若上一次读取键盘输入没有读完,下一次读取会从上次调用函数结束的地方开始

③若指定了读取宽度,则将满足字宽和第一个空白字符**“做或逻辑”**

用例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *str = malloc(10);
    if (str)
        scanf("%s", str);

    printf("%s\n", str);
    free(str);
    return 0;
}

结果:
C语言中的字符串输入(gets_s、fgets、scanf、fscanf)与相关内存分配知识,c语言,开发语言

该函数在Linux和Win的VS中均可用


如果本文对您有用,可以点赞、收藏本文哦,下次用到时就好找多了
如果能关注作者就太好了,作者将持续学习,持续输出,持续分享!谢谢鼓励!文章来源地址https://www.toymoban.com/news/detail-516662.html

到了这里,关于C语言中的字符串输入(gets_s、fgets、scanf、fscanf)与相关内存分配知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言-字符串与输入输出

    在 C 语言中,字符串实际上是使用空字符 \\0 结尾的一维字符数组。因此,\\0 是用于标记字符串的结束。 空字符(Null character)又称结束符,缩写 NUL,是一个数值为 0 的控制字符,\\0 是转义字符,意思是告诉编译器,这不是字符 0,而是空字符。 比如:下面声明和初始化创建

    2024年02月02日
    浏览(61)
  • C语言如何输入一个字符串?

    在 scanf() 和 printf() 函数中, %s 指的就是字符串 所以我们就可以使用 scanf(\\\"%s\\\",str) 和 printf(\\\"%s\\\",str) 从键盘处读取字符串并将字符串打印出来 代码如下: 这里要注意的一点是:在 scanf 函数中,后面的参数必须是一个地址,如输入一个整形变量: scamf(\\\"%d\\\",a) ,都需要进行 取地址操

    2024年02月04日
    浏览(63)
  • 将输入的字符串反向输出(c语言)

    2024年02月05日
    浏览(64)
  • 如何用C语言读取不定长字符串输入

    上述代码中,我们使用了一个字符数组 str 来存储用户输入的字符串,数组大小为 MAX_STR_LEN 。然后,我们使用 getchar() 函数逐个读取字符,并将其存储到数组中,直到读取到换行符为止。在读取过程中,我们还需要检查字符数是否超过了数组的长度,以防止内存溢出。 最后,

    2024年02月08日
    浏览(50)
  • C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)

    分析:    在程序中,定义一个函数 fix,该函数使用指针变量来访问字符串中的每个字符,并计算出字符串的长度。fix 函数的参数为指向 char 类型的指针变量 p,表示需要计算长度的字符串。   在主函数 main 中,定义一个大小为 20 的字符数组 a,用于存储输入的字符串。然

    2024年01月21日
    浏览(80)
  • 【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数

    gets函数类似于scanf函数,用于读取标准输入.前面我们已经知道scanf函数在读取字符串时遇到空格就认为读取结束,所以当输入的字符串存在空格时,我们需要使用gets 函数进行读取. gets函数的格式如下: gets函数从STDIN (标准输入)读取字符并把它们加载到str(字符串)中,直到遇

    2024年01月22日
    浏览(55)
  • 深入解析C语言中的字符串和字符串处理函数

    标题:详解C语言中的字符串和字符串处理函数 目录: 1.引言 2.什么是C语言中的字符串 3.字符串的表示方式 4.C语言中的字符串处理函数 5.例子:使用字符串处理函数的示例代码 6.总结 在C语言中,字符串是一种常见的数据类型,用于存储一串字符。本篇博客将详细介绍C语言中

    2024年02月15日
    浏览(52)
  • 掌握字符与字符串:C语言中的神奇函数解析(一)

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 我们在学习C语言的过程中,除了使用最多的头文件stdio.h,还会使用其他头文件,利用其中的库函数帮助我们简化代码的过程,比如像math.h,string.h等头文

    2024年03月09日
    浏览(65)
  • 掌握字符与字符串:C语言中的神奇函数解析(二)

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 声明:int strncmp(const char *str1, const char *str2, size_t n) str1 -- 要进行比较的第一个字符串。 str2 -- 要进行比较的第二个字符串。 n -- 要比较的最大字符数。 作

    2024年03月09日
    浏览(67)
  • 掌握字符与字符串:C语言中的神奇函数解析(三)

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 除了字符函数和字符串函数,string.h中还有一类 内存操作函数 ,如memset(),memcmp()等函数,他们在功能和某些字符串函数很像,但作用范围更广,除了作用

    2024年03月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包