一、核心字符串输入函数解析 字符串输入的核心需求是从指定数据源(如键盘、文件)读取字符序列并存储为C语言字符串(以'\0'结尾)。但不同输入函数在安全性、灵活性上差异显著,下面逐一详解。...1.3.1 函数简介与原型(聚焦%s) 功能:通过%s格式符从标准输入读取字符串,读取规则为:跳过开头的空白字符(空格、制表符、换行符),然后读取非空白字符,直到再次遇到空白字符或EOF时停止,自动在读取的字符序列末尾添加...函数原型: int puts(const char *str); 参数说明:str:指向要输出的字符串的指针(必须是以'\0'结尾的有效字符串)。...包含换行符的原因:fgets的设计规则是“读取到换行符时停止,且保留换行符”,仅在读取长度达到n-1或遇到EOF时才不保留换行符。这是与gets的核心差异之一,也是其可判断是否读取完整行的依据。...= NULL) { *newline = '\0'; // 替换为结束符 } 注意:需包含string.h头文件,且仅当newline不为NULL时操作(避免未找到换行符导致空指针)。
0’等价)结尾的char数组就是一个字符串 但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组 所以:字符串是一种特殊的char数组。...字符串的特点: 以\0结尾:字符串必须以空字符\0结尾,否则无法正确识别字符串的结束。 字符数组的变体:字符串本质上是字符数组,但它的内容必须是可打印字符,并以\0结尾。...%s格式符输入字符串: char str[20]; scanf("%s", str); // 从键盘输入字符串 scanf会以空格或换行符作为输入结束标志。...若str指向的不是空字符\0结尾的字符数组:puts()函数会在输出时超出字符串的实际边界,导致未定义行为。...字符串必须以 \0 结尾 如果字符串没有以 \0 结尾,strlen() 的行为是未定义的,可能会导致程序崩溃或错误结果。
补充:必须指定用户进程缓冲区的长度n,即buf的大小,此函数从流中一直读到下一个换行符为止,但是不超过n-1个字符,读入的字符被送入用户缓冲区buf中。该缓冲区以null字符结尾。...补充:将一个以null结尾的字符串写到标准输出上,相当于进程->流->标准输出文件。终止符不写出,但是puts然后又将一个换行符写到标准输出。应当少用,以免需要记住它在最后是否添加了一个换行符。...当fgets时会在用户buf中增加一个null以标识用户buf的结束,而fputs时,以null为终止字符,但是尾端的null并不写在流中。...而对于一次一行的方式,当每次结构体中有null字符时,fputs就会停止,所以也不能用它实现读结构,同时fgets中包含有null字节或换行符,其也不能正常工作。...当从网络读时,网络中缓冲机构可能造成返回值小于所要求读的字节数。 当从管道或FIFO读时,如若管道包含的字节少于所需的数量,那么只返回实际用的字节数。
补充:将一个以null结尾的字符串写到标准输出上,相当于进程->流->标准输出文件。终止符不写出,但是puts然后又将一个换行符写到标准输出。应当少用,以免需要记住它在最后是否添加了一个换行符。...当fgets时会在用户buf中增加一个null以标识用户buf的结束,而fputs时,以null为终止字符,但是尾端的null并不写在流中。...puts() 函数是 C 库函数,用于在标准输出中输出一个以 null 结尾的字符串。该函数向标准输出设备(通常是屏幕)输出字符串,并在字符串的末尾添加换行符(’\n’)。...当scanf()检测到“文件结尾”时,会返回EOF(EOF是字符串中的特殊值,通常手动用#define指令把它定义为-1)(在CPrimerPlus第六章中讨论文件结尾相关内容以及如何利用scanf()...scanf()跳过空白字符开始读取第一个非空白字符,并保存非空白字符直到遇到下以恶搞空白字符,这意味这%s转换说明只能读取不包含空白地府的字符串,scanf会在字符序列的末尾加上\0,让数组中的内容形成一个字符串
细节 ①在从文件读取时判断结束的条件是EOF,但从字符串读取时,判断条件则为'\0'(字符串默认以'\0'结尾); ②注意缓冲区溢出问题,如下方示例中以char [200]数组sbuffer接受读取到的字符...,接受的字符不能大于等于num(这里即199)——因为字符串默认以'\0'结尾,所以这里还要我们手动添加\0。...②fputs不会检查字符串是否以\0结尾,如果传入的字符串没有 \0 结尾,可能导致缓冲区溢出或写入乱码。...返回值:成功时返回非负值(通常是输出的字符数,包括换行符),失败返回 EOF。 细节 传入的指针必须指向以 \0 结尾的字符串,否则会导致未定义行为(如输出乱码)。...参数:stream,输入文件流(如 FILE *p);format,格式化字符串(与 scanf 格式相同,类似于scanf的第一个参数);…表示format可以有多个。
本文将聚焦两类最核心的标准I/O函数——格式化输入输出函数(以printf、scanf为代表)和字符输入输出函数(以getchar、putchar为代表),从函数简介、原型、实现逻辑、使用场景、注意事项...注意事项: 格式说明符与参数必须匹配:若格式说明符为%d(整数),但传入字符串参数,会导致未定义行为(输出乱码或程序崩溃)。...字符串必须以'\0'结尾:使用%s输出字符串时,若字符串未以空字符结尾,printf会持续读取内存直到遇到'\0',导致输出乱码。...%s的缓冲区溢出风险:读取字符串时,scanf会持续读取直到遇到空白字符,若输入长度超过数组容量,会覆盖内存中其他数据。...真题1:为什么scanf读取基本类型变量时需要加取地址符&,而读取字符串数组时不需要?
,有时紧跟着单个字符(占位符),并以小括号括住的描述结尾。 【扫描】 一组类似的函数通过扫描已格式化的文本来产生值。...Scanln、Fscanln 和 Sscanln 在换行符处停止扫描,且需要条目紧随换行符之后;Scanf、Fscanf 和 Sscanf 需要输入换行符来匹配格式中的换行符;其它函数则将换行符视为空格...Scanf、Fscanf 和 Sscanf 根据格式字符串解析实参,类似于 Printf。例如,%x 会将一个整数扫描为十六进制数,而 %v 则会扫描该值的默认表现格式。 ...格式化行为类似于 Printf,但也有如下例外: %p 没有实现 %T 没有实现 %e %E %f %F %g %G 都完全等价,且可扫描任何浮点数或复合数值 %s 和 %v 在扫描字符串时会将其中的空格作为分隔符...当以某种格式进行扫描时,无论在格式中还是在输入中,所有非空的连续空白字符 (除换行符外)都等价于单个空格。
在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。 2、'\0’的重要性 #include //下面代码,打印结果是什么?为什么?...指针 char *s = "abc"; 指向只读的字符串常量(不可修改内容) 4、与字符串相关的格式说明符 在 C 语言中,与字符串相关的格式说明符主要用于输入/输出函数 (1)%s 用途:输入/输出...字符串(以 ‘\0’ 结尾的 char 数组或指针)。...,加空格: scanf(" %c", &ch); // 忽略前面的空格/换行 (3)%p 用途:输出 指针的地址(十六进制格式)。...("Hello world", "wor"); // pos现在是6 注意事项 使用这些函数时要确保目标数组足够大 字符串必须以’\0’结尾 数组索引从0开始计算 记得包含头文件 #include
参数: str:str是指针,指向了要写入的字符串(必须以\0结尾) stream:是一个FILE*的指针,指向了要写入字符串的流。...,至读取到换行符\n、文件末尾(EOF)或者达到指定字符数(包含结尾的\0),然后将读取到的字符串存储到str指向的空间中。...使用细节: 若读取到换行符\n,会将其包含在字符串中(除非超过num-1限制),然后以\0结尾。 文件末尾没有换行符时,字符串以\0结尾,不包含\n。...文件末尾没有换行符时,字符串以\0结尾,不包含\n。...//类比scanf学习 功能:fscanf时从指定文件流中读取格式化数据的函数。
输出表列中给出了各个输出项,要求格式控制字符串和各输出项在数量和类型上应该一一对应。 其中格式控制字符串是以%开头的字符串,在%后面跟有各种格式控制符,以说明输出数据的类型、宽度、精度等。...输出字符串中的字符直至字符串中的空字符(字符串以空字符’\0‘结尾) printf("%s","测试test");输出:测试test S wchar_t* 宽字符串。...输出字符串中的字符直至字符串中的空字符(宽字符串以两个空字符’\0‘结尾) setlocale(LC_ALL,"zh_CN.UTF-8"); wchar_t wtest[]=L"测试Test"; printf...当scanf()检测到“文件结尾”时,会返回EOF(EOF是字符串中的特殊值,通常手动用#define指令把它定义为-1)(在CPrimerPlus第六章中讨论文件结尾相关内容以及如何利用scanf()...当读写double类型的数值时,在e、f、g前放置字母l: 注意:只能在scanf函数格式串中使用l,不能在printf函数格式串中使用。
,有时紧跟着单个字符(占位符),并以小括号括住的描述结尾。 1.2. Scanning 一组类似的函数通过扫描已格式化的文本来产生值。...Scanln、Fscanln 和 Sscanln 在换行符处停止扫描,且需要条目紧随换行符之后;Scanf、Fscanf 和 Sscanf 需要输入换行符来匹配格式中的换行符;其它函数则将换行符视为空格...Scanf、Fscanf 和 Sscanf 根据格式字符串解析实参,类似于 Printf。例如,%x 会将一个整数扫描为十六进制数,而 %v 则会扫描该值的默认表现格式。...格式化行为类似于 Printf,但也有如下例外: %p 没有实现 %T 没有实现 %e %E %f %F %g %G 都完全等价,且可扫描任何浮点数或复数数值 %s 和 %v 在扫描字符串时会将其中的空格作为分隔符...当以某种格式进行扫描时,无论在格式中还是在输入中,所有非空的连续空白字符 (除换行符外)都等价于单个空格。
用 strSource 的首字符覆盖 strDestination 的结尾空字符。当字符串被拷贝或添加时不执行上溢出检测。 如果源和目的字符串重叠,strcat 的行为是不确定的。...以空字符结尾的源字符串。 ...要查找的以空字符结尾 的字符串。 ...getchar 函数原型:int getchar(void); 功能和返回值:从 stdin 读取一个字符并返回所读字符,当出现读错误或遇到文件结尾时返回 EOF。 ...返回值:返回该命令解释器所返回的值,且当该命令解释器返回0时它返回0。返回值-1指出 一个错误。
() 从标准输入到读取格式化输入 需要传递变量的地址(使用&运算符又被称为取地址符) 格式字符串中的空格会匹配任意数量的空白字符 读取字符串时要小心缓冲区溢出 #include 格式符只会读取数字字符,回车键(\n)会被留在输入缓冲区中。 接下来执行 scanf("%c", &num2) 时,%c 格式符会直接读取缓冲区中残留的 \n(而不会等待用户输入新的字符)。...最后 printf("%c", num2) 输出的其实是 \n(换行符),导致看起来像 “只输出了数字”。...但一个单引号里面最多只能有4个字符(在使用putchar函数情况下,并且只会输出最后一个字符),双引号用来表示字符串, puts 功能:输出字符串,并自动追加换行符 \n。...原型:int puts; 参数:s 为待输出的字符串(需以 \0 结尾) vs中输入输出函数不只有这几个,但足够使用,后续遇到会补充。
参数: str:str是指针,指向了要写入的字符串(必须以\0结尾) stream:是一个FILE *的指针,指向了要写入字符串的流 返回值: 成功时返回非负整数。...: 若读取到换行符(\n),会将其包含在字符串中(除非超出num-1限制),然后以\0结尾 文件末尾无换行符时,字符串以\0结尾,不包含\n 1.6 fprintf int fprintf ( FILE...:可变参数列表,提供与格式字符串中说明符对应的数据 返回值: 成功时:返回写入buffer的字符数(不包含结尾的空字符\0) 失败时:返回负值 5.10.2 sscanf int sscanf ( const...它与scanf类似,但输入源是内存中的字符串而非控制台或文件。常用于解析字符串中的结构化数据(如提取数字、分割文本等)。...:将缓冲区中为写入的数据立即写入文件 对输入流:行为由具体实现决定,非C语言标准行为(可能清空输入缓冲区) 参数为NULL时:刷新所有打开的输出流 参数: stream:指向文件流的指针(如stdout
'(数字0)结尾 字符串常量 :由双引号括起来的字符序列。...scanf 函数接收数据时,如果存储空间不足,数据能存储到内存中,但不被保护。 不能使用scanf 函数接收带有空格的字符串。...scanf 函数接收字符串时,如果碰到 空格 和 换行 会自动终止。...不会读取输入缓冲区中的换行符 \n,因此不需要额外处理。 scanf函数默认会以空格、制表符或换行符作为输入的结束,因此其无法直接读取包含空格的字符串。...scanf函数会将读取到的字符串存储到这个数组中,并自动在字符串末尾添加结束符'\0' 所以%[^\n]表示读取除换行符以外的所有字符,直到遇到换行符为止。这样就可以读取包含空格的字符串。
当需要处理包含换行符的长字符串(如段落文本、代码片段、日志信息等)时,YAML 提供了两种强大的标量块样式:字面块 (|) 和 折叠块 (>)。...结果: 解析后的字符串是一个“折叠”的文本段落。原本独立的非空行被合并成用空格连接的单行,但空行和以 \ 结尾的行会创建新的行。...默认情况下,YAML 解析器会在解析后的字符串末尾添加一个换行符 (\n)。这是符合 POSIX 标准的常见行为(文本文件以换行符结尾)。...可以使用块指示符修饰符控制这个行为:| 或 >:默认行为,保留块末尾的换行符(即添加一个 \n)。|- 或 >-:剥离 (strip) 块末尾的换行符。解析后的字符串不包含最后一个换行符。...(| vs >)选择 | (字面块) 当:你需要完全保留原始格式、所有换行符和行尾空白。内容本质上是代码、结构化文本或预格式化内容。
在块内定义的变量(局部变量),通常存储在栈(Stack)上。当程序执行流离开右花括号}时,这些变量会被自动销毁,内存被回收。...未初始化的危险如果定义局部变量时不初始化,它的值是什么?答案是:垃圾值。这块内存之前被谁用过,留下了什么数据,现在就是什么。直接使用未初始化的变量是C语言中最常见的Bug来源之一。...当用户输入100并按下回车时,输入流中实际包含:100\n(换行符)。1.scanf("%d",&num)读走了100。\n仍然停留在缓冲区中。...("%c",&ch);//会直接读到上次的回车//正确写法1:在格式串前加空格,指示跳过所有空白符(含换行)scanf("%c",&ch);//正确写法2:手动吃掉缓冲区里的换行符//getchar()...详解:scanf的%d格式符会自动跳过所有的空白字符(空格、Tab、换行符),直到找到数字为止。所以输入中的空格不会造成阻碍,反而充当了分隔符。题15解析答案:合法。详解:这是两条空语句。
字符串输入 分配空间 要做的第一件事是分配空间,以存储稍后要读入的字符串。 这意味这要未字符串分配足够的空间,注意计算机在读取字符串时不会计算它的长度。...= '\n')//当读取到文件结尾或出现了换行符时停止循环 fputs(words,stdout); puts("Done."); return 0; } 输出...(类似于gets) 如果gets_s()函数读取到最大字符都没有读取到换行符时,会执行以下几步: 首先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读取到换行符或文件结尾,然后返回空指针。...scanf()函数 使用scanf()和%s转换说明读取字符串。scanf()和gets()或者fgets()的区别在于它们如何缺点字符串的末尾。...分析:scanf第二次读取数据时从上一次调用结束的地方继续读取数据。
——菜根谭 学生:我用 scanf %d 读取一个数字, 然后再用 gets() 读取字符串, 但是 编译器好像跳过了 gets() 调用! 小林:scanf %d 不处理结尾的换行符。...如果输入的数字后边紧接着一个换行符, 则换行符会被 gets() 处理。...作为一个一般规则, 你不能混用 scanf() 和 gets(), 或任何其它的输入例程的调用; scanf 对换行符的特殊处理几乎一定会带来问题。...要么就用 scanf() 处理所有的输入, 要么干脆不用。 学生:我发现如果坚持检查返回值以确保用户输入的是我期待的数值, 则scanf() 的使用会安全很多, 但有的时候好像会陷入无限循环。...如果用户在数字格式的 scanf 如 %d 或 %f 中输入字符 ‘x’, 那么提示后并用同样的 scanf() 调用重试的代码会立即遇到同一个 ’x’。
(包括空白符、换行符等) 输出出错:返回负数(如果不用变量接收错误的printf,程序就会出错。...而尾随的每个参数占用的栈空间大小又是通过第一个格式字符串确定的。...二、scanf scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。...其调用格式为: scanf("格式化字符串>",); scanf()函数返回成功赋值的数据项数,出错时则返回EOF。 其控制串由三类字符构成: 1。格式化说明符; 2。...原因:用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括 空格,制表符,换行符,回车符和换页符。