一、一些输入语句的笔记(注:以下一切笔记均在 截至2023.7的最新版VS测试环境下 得到并记录,并不保证之后版本不会改变,仅供个人学习了解。)
1、gets/gets_s/fgets
新版C标准库中gets函数应替换为 gets_s 或 可用fgets,相关简介如下:
---gets_s(存储位置, 读取位数):读取到\n时在其后停止,并将\n替换为\0。(又因为字符串后必须接\0,所以只能读取 定义的位数-1位,最后一位要留给\n用来换成\0。超了可能会报错)
---fgets(存储位置, 读取位数 , stdin):读到\n时在其后停止并将\n录入作为一位再在下一位添加\0 , 或 读满 定义的读取位数-1位 自动停止再把最后一位赋值为\0。(超过 定义的读取位数-1位 则会将多余的输入遗留在输入流中。)*例:定义的读取位数为101,则只读100位,第101位被赋为\0,若输入流中有101位(最后一位是\n或其他),则第101位(\n或其他)将遗留在输入流中。
2、scanf/scanf_s
scanf/scanf_s:在%s模式下只会在 \n前 停下 并在字符串后自动添加\0后录入,而将输入字符串后的\n遗留在输入流。若 直接输入\n 则会跳过并继续读取,直到读到字符,并在 读到字符串后 再遇到的 第一个\n前结束。
scanf额外特性:在%s模式下:如果超过数组长度,仍不断读取直到遇到\n并在其前停下,然后在最后添加\0,但赋值时只从头开始赋值,多余字符和\0都会被一同舍弃。
scanf_s额外特性?:在%s模式下:自动在字符串最后加上\0并算作单独一位,如果超过定义的读取位数则录入 定义的读取位数 个字符后,\0仍会被加上,但会被加在第0位,并导致原有录入数据全部丢失。输入流中剩余:实际位数 - 定义的读取位数 位将被遗留。
二、运用cmd重定向测试程序(win11环境)
*注:power shall似乎并不支持这么做。
简单案例代码:
#include <stdio.h>
int main()
{
char a[10], b[10], outputTemplate[50];
gets_s(outputTemplate, 50);
gets_s(a, 10); //gets_s不会读入\n
fgets(b, 10, stdin); //fgets读入了\n
puts(outputTemplate); //输出完字符串后如果没换行,会自动追加换行
printf("%s%s", a, b);
return 0;
}
1、菜单栏:生成—>生成解决方案后,在输出控制台:生成的输出来源里 就可以看到最新动态和生成程序的位置了。(找到平时调试时生成的程序文件是一样的)
2、打开cmd,直接将生成出的.exe程序拖入,其完整路径就会录入cmd了,之后输入“<”,再拖入准备好的输入文件,此处我准备好的文件就是位于D盘的in.txt文件,其中内容:
I have a/an
apple
pie
回车后下方两行跳出的就是将in.txt文件内容输入后输出的结果了。
3、如需输出到指定文件则在上述指令基础上,在后面再添加“>”,并拖入输出的目标文件,此处我准备的时位于D盘的out.txt(空)文件
回车后跳出等待指令,就已经执行完毕,打开输出的目标文件就能看到以下内容:
I have a/an
applepie
4、对比两文件格式:fc ”空格“ 文件1 ”空格“ 文件2 /n
若出现不同会列出不同部分:
总结:
本文仅仅时学习笔记和部分经验总结,内容可能有误,相关记录仅供参考。如能有所帮助,不胜荣幸,感谢阅读。
参考文献:
[1] 罗勇军,郭卫斌. 算法竞赛入门到进阶[M]. 北京:清华大学出版社,2019