我一直在从文本跳到文本,我发现在C语言中使用输入函数并没有真正讨论到中途。是否存在疯狂的方法?在C中获得的用户输入是否是一个不被认为是基础知识的主题的复合体?
我问,因为我发现各种各样的用户输入是最有趣的学习方式,并且没有足够的内容让我对看起来像学习C的传统工作流程感兴趣。
发布于 2019-06-13 09:13:00
在C语言中处理来自用户的输入是棘手的。如果您决定编写一个要求用户输入C的程序,请处理它。
在现实世界中,你试图解决代码的实际问题而不仅仅是练习练习语言,那么你就不会在C中处理这些东西,除非它在代码中是一个非常小的东西。您可以使用像Python这样的语言来完成这些任务。
基于相同的原因,您没有太多关于如何为Python中的大型矩阵编程高效矩阵乘法的问题。如果你真的需要在你的Python程序中做这样的事情(并且由于某些原因你不能使用现有的库),答案就是编写C模块并将其导入Python。
有一些方法可以通过遵循以下指导方针来减少至少90%的头痛或低于99的任意大数:每当您想要从用户那里阅读某些内容时,请阅读整行。不要用scanf
。用fgets
阅读的完整产品线,然后对其进行处理sscanf
。并且还记得要经常检查返回值。这是一个例子:
#define bsize = 100;
char buffer[bsize];
int x,y;
float f, g;
int r;
printf("Enter two integers: ");
fflush(stdout); // Make sure the printf is executed before reading
if(! fgets(buffer, bsize, stdin)) {
fprintf(stderr, "An error occured\n");
exit(1);
}
if((r = sscanf(buffer, "%d%d", &x, &y)) != 2) {
fprintf(stderr, "An error occured. You entered:\n%s\n" buffer);
fprintf(stderr, "%d successful conversions", r);
exit(1);
}
printf("Enter a float and a char: ");
fflush(stdout);
if(! fgets(buffer, bsize, stdin)) {
fprintf(stderr, "An error occured\n");
exit(1);
}
if((r = sscanf(buffer, "%f%f", &f, &g)) != 2) {
fprintf(stderr, "An error occured. You entered:\n%s\n" buffer);
fprintf(stderr, "%d successful conversions", r );
exit(1);
}
printf("You entered %d %d %f %f\n", x, y, f, g);
这通常是矫枉过正的,代码变得非常大,但是首先读取一行然后处理它的方法使得大多数时候调试变得更加容易。此外,它让你不必担心刷新输入缓冲区。我可能会提到这fflush(stdin)
是未定义的行为,所以不要使用它。
发布于 2019-06-13 09:33:22
以下是我在C中输入的“规则”。(这些都有点自以为是,但这就是你要求的。)
scanf
或fscanf
。fgets
或等效的读取行,然后根据需要进行解析。(我,我通常使用自己的单词破坏getargs
功能,这有点相当于strtok
。)getc
,或者编写自己的读取令牌的词法分析器。get16
和get32
,其内容16或32字节的整数。(这些以与机器和字节顺序无关的方式编写相当简单)。对于其他类型的数据,请使用fread
。fread
它来一次读取所有内容。有关详细信息,请参阅第12.5节,或第12章的其余部分,然后参阅这些C编程课程说明中的第17章。有关将文本行分解为以空格分隔的“单词”的更多信息,另请参见第10.8节。
发布于 2020-12-04 09:48:48
很多人可能到现在也不是很明白stdio.h这个头文件有什么作用,初学者看书的时候应该看到过这句话:
C语言本身是不包含输入输出语句的。
printf函数和scanf函数一样,都被声明在头文件stdio.h里。(特殊IDE除外)
如果在开头没有加stdio.h,你如果不用输入输出语句是没有一点问题的,代码为证:
先看下scanf的用法
scanf(格式控制,地址表列)
格式控制和printf函数一样,地址表列是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址
上面是scanf函数的格式,这里着重强调一下地址列表。
小案例:
a是一个整型变量,上面的scanf后半句加了一个&符号,读者要弄清楚&是干什么用的:&是一个取地址运算符,&a表示a变量的地址,这样才符合scanf的用法。
scanf还有一个特点是:
从键盘输入的样式一定要和你在代码中输入的样式一样,如果一样则会出现逻辑性错误。
代码为证:
错误1:输出一个数后换行
错误2:两个数之间有逗号
正确输出
此外还需要注意的一点事:在输入数值数据时,如输入空格、回车、Tab键或遇到非法字符,认为该数据结束。
直白话就是,如果想录入空格,不要用scanf函数,不是录不了,比较复杂,想了解用法的,可以自行百度,gets函数可以直接录入空格。
更多详细案例可以go公众号:C语言入门到精通
https://stackoverflow.com/questions/-100007006
复制相似问题