我只是问这个代码中getchar做了什么以及它是如何工作的?我不明白为什么getchar会影响代码,对我而言似乎只是获取了值,但没有对值进行任何操作。
protected void sendEmail() {
Log.i("Send email", "");
String[] TO = {""};
String[] CC = {""};
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setData(Uri.parse("mailto:"));
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_EMAIL, TO);
emailIntent.putExtra(Intent.EXTRA_CC, CC);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, " Your Subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, " Your Text Here"+((EditText) findViewById(R.id.editTextID)).
getText().toString());
emailIntent.setType("message/rfc822");
try {
startActivity(Intent.createChooser(emailIntent, "Send mail..."));
finish();
}
catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(CurrentActivityName.this, "There is no email client installed.", Toast.LENGTH_SHORT).show();
}}
答案 0 :(得分:3)
为什么getchar()
可能会在那里使用的一些可能性:
1)如果完成忽略空格(通常在使用%c
扫描字符时使用),则此处不需要它,因为%d
无论如何都会忽略空格。
2)其他可能性是在此循环之后,进行了一些进一步扫描,最后一次调用\n
时遗留的最后scanf()
可能是个问题。因此,getchar()
可能会被用来忽略它。
3)如果您输入的字符与%d
不匹配,scanf()
将失败。因为您输入的字符会保留在输入流中,并且您再也无法读取int
(例如,如果您输入abcdddgdfg
而没有getchar()
来电)。所以,getchar()
这里将消耗所有这些
字符(每次迭代一次),最终您将能够再次阅读int
(使用%d
)。
但这真的不需要;它只是试图修复scanf()
的缺陷。使用scanf()
读取输入并使其正确确实很难。这就是为什么如果你只是扫描整数,总是建议使用fgets()
并使用sscanf()
或使用strto*()
函数进行解析的原因。
请参阅:Why does everyone say not to use scanf? What should I use instead?
答案 1 :(得分:1)
在此代码中,false
被调用其副作用:它从标准输入中读取一个字符并将其抛弃。
这可能是读取用户的输入。 getchar
将使用一个数字,但在数字未更改后保留换行符。 scanf
使用换行符并将其丢弃。这在循环中并不是绝对必要的,因为 next getchar
将跳过空格来查找下一个数字,但如果代码在循环并不期望在stdin上首先使用换行符。
这段代码有问题,因为它没有检查EOF,因为当输入不一个数字或者数字后面的行上有更多文字时它没有做任何明智的事情,并且因为它使用了scanf
,它按指定方式被破坏(例如,如果输入溢出scanf
的范围,则允许使程序崩溃)。更好的代码就像是
int
答案 2 :(得分:0)
最有可能的代码是读取整数列表,用新行分隔。
scanf将读入整数,并将其放入变量c。
getchar正在读取下一个字符(假设换行)
由于它没有检查,因此有可能它不是新行,或者scanf失败,因为它试图读取的不是数字。
答案 3 :(得分:0)
$$month
只是在数字后读取和消费字符,无论是空格,逗号,换行符还是其他整数或其他任何内容的开头。
IMO,这不是强大的代码。好的代码将1)至少测试getchar();
的结果和2)测试或限制后续字符的消耗,以防止“吃”下面数字的潜在符号。记住代码无法控制用户键入的内容,但必须处理输入的内容。
scanf()