当你花时间考虑它时,如果没有某种方式与使用它的人交谈,计算机将毫无用处。就像我们需要信息才能完成任务一样,计算机也是如此。就像我们向他人提供信息以便他们可以完成任务一样,计算机也是如此。
这些信息的供应和返回到计算机称为输入和输出。“输入”是提供给计算机或程序的信息。“输出”是由计算机或程序提供的信息。通常,计算机程序员会将讨论集中在更通用的术语输入/输出或简单的I / O中。
在C中,程序与用户通信有许多不同的方式。令人惊讶的是,通常教给初级程序员的最简单的方法也可能是最强大的。在你好,世界!在本文开头的例子中,我们介绍了一个标准库文件stdio.h
,以及它的一个函数,printf()
。在这里,我们讨论了更多stdio.h
给我们的功能。
使用printf()
输出
回顾本文开头的演示程序,重复如下:
#include <stdio.h> int main (void ) { printf (“Hello,World!” ); 返回 0 ; }
如果您编译并运行此程序,您将在屏幕上看到下面的句子:
你好,世界! |
通过使用该功能 实现了这一惊人的成就printf()
。功能就像一个“黑匣子”,可以为你做一些事情,而不会暴露内部的内部。我们可以在C中自己编写函数,但稍后我们将介绍它。
您已经看到printf()
在括号之间使用一个用引号括起来的文本。我们将引号括起来的文本称为文字字符串(或只是一个字符串),我们将该字符串称为printf 的参数。
作为解释的说明,有时在函数名称后面包括开括号和右括号以提醒我们它确实是一个函数是方便的。但是,通常在理解我们所讨论的函数的名称时,没有必要。
正如您在上面的示例中所看到的,使用printf()
可以像输入一些文本一样简单,用双引号括起来(注意这些是双引号而不是两个单引号)。因此,例如,您可以通过将其作为参数放置到printf()
函数中来打印任何字符串:
printf(“这句话会打印出你看到的……”); |
一旦它包含在一个适当的main()
功能中,它将显示:
这句话将打印出来,就像你看到的那样…… |
打印数字和转义序列
占位符代码
该printf()
函数是一个功能强大的函数,可能是C程序中最常用的函数。
例如,让我们看一个问题。假设我们想要计算:19 + 31.让我们用C来得到答案。
我们开始写作
#include “stdio.h”//这很重要,因为printf //如果没有此标题,则无法使用 int main (void ) { printf (“19 + 31 is” );
但在这里我们被困住了!printf()
只打印字符串!值得庆幸的是,printf有打印数字的方法。我们所做的是在字符串中放置占位符格式代码。我们写:
printf (“19 + 31是'''%d'''' , 19 + 31 );
占位符%d
字面上“保留了实际数字的位置”,这是添加19到31的结果。
这些占位符称为格式说明符。许多其他格式说明符可以使用printf()
。如果我们有一个浮点数,我们可以%f
用来打印浮点数,小数点和全部。其他格式说明符是:
%d
– int(与%i相同)%ld
– long int(与%li相同)%f
– 漂浮%lf
– 双[1]%c
– char%s
– 字符串%x
– 十六进制
所有的格式说明符的完整列表的printf()
是printf格式字符串。
标签和换行符
如果,我们想要实现一些看起来像的输出:
1905 312 + -----
printf()
不会在每个陈述的末尾加上换行符:我们必须自己做。但是怎么样?
我们能做的是使用换行符转义字符。转义字符是我们可以编写的特殊字符,但会在屏幕上执行一些特殊操作,例如发出蜂鸣声,编写选项卡等。写一个我们写的新行\n
。所有转义字符都以反斜杠开头。
所以要实现上面的输出,我们写
printf (“1905 \ n 312 + \ n ----- \ n ” );
或者更清楚一点,我们可以在几行中打破这个长期的printf声明。所以我们的计划将是
#include <stdio.h> int main (void ) { printf (“1905 \ n ” ); printf (“312 + \ n ” ); printf (“----- \ n ” ); printf (“%d” , 1905 + 312 ); 返回 0 ; }
还有其他的转义字符,我们可以使用。另一个常见的\t
用于编写选项卡。您可以\a
用来敲响计算机的铃声,但是您不应该在程序中使用它,因为过度使用声音对用户来说不是很友好。
其他输出方法
puts()
puts()
当您没有要关注的占位符或变量时,该函数是将字符串发送到屏幕的一种非常简单的方法。它的工作方式与printf()
我们在“Hello,World!”中看到的功能非常相似。例:
puts (“打印此字符串。” );
将打印到屏幕:
打印此字符串。
然后是换行符(如上所述)。(该puts
函数在其输出中附加换行符。)
使用scanf()
输入
该scanf()
函数是与printf()
输出函数等效的输入方法- 简单但功能强大。在最简单的调用中,scanf 格式字符串包含一个占位符,表示用户将输入的值的类型。这些占位符与printf()
函数大致相同- %d
对于整数,%f
浮点数和%lf
双精度数。
然而,与之scanf()
相比,存在一种变化printf()
。该scanf()
函数需要您要保存输入值的变量的内存地址。虽然这里可以使用指针(存储内存地址的变量),但这个概念直到文本后面才会被提及。相反,简单的技术是使用地址运算符&。现在,在我们讨论指针之前,最好考虑这个“魔术” 。
典型的应用程序可能是这样的:
#include “stdio.h” int main (void ) { int a ; printf (“请输入一个整数值:” ); scanf (“%d” , &a ); printf (“你输入:%d \ n ” ,a ); 返回 0 ; }
如果您要描述scanf()
上面函数调用的效果,它可能读作:“从用户读入一个整数并将其存储在变量a的地址”。
如果你想输入一个字符串使用scanf函数,你应该不包括与运营商。下面的代码将产生运行时错误,程序可能会崩溃。
scanf (“%s” , &a );
正确的用法是:
scanf (“%s” , a );
这是因为,每当您使用string(%s
)的格式说明符时,用于存储值的变量将是一个数组,并且数组名称(在本例中为-a)本身指出它们的基址,因此,不需要运营商的地址。
(虽然,这是容易受到缓冲区溢出。fgets()
优选的是scanf()
)。
有关输入的注意事项:在键盘上键入数据时,信息不会直接显示在正在运行的程序中。它首先存储在所谓的缓冲区中 – 为输入源保留的少量内存。当程序想要从输入源读取时,有时会在缓冲区中留下数据,并且该scanf()
函数将读取该数据而不是等待用户输入内容。有些人可能会建议您使用该功能fflush(stdin)
,这可能在某些计算机上按预期工作,但不被视为良好做法,您将在后面看到。如果您将代码带到具有不同编译器的其他计算机,那么执行此操作就会失败,您的代码可能无法正常运行。
猜你想读:《C编程.开始C》7.操作员和类型铸造