所以我做了一些谷歌搜索,发现使用代码:
#include <stdio.h>
void main()
{
char ch;
ch = fgetc(stdin);
if (ch == 'n')
{
printf("n");
}
else
{
printf("n");
}
}
确实做了我想要的,但是将这些代码行粘贴到我的其他项目中,有scanf_s似乎没有提示用户在'ch = fgetc(stdin)'处输入。我想知道是否有一种方法可以将ch = fgetc(stdin)
更改为扫描码,以便它可以读取ENTER并退出程序。
大多数scanf
说明符将在输入流中留下一个挂起的换行符。
因此紧跟在scanf
之后,fgetc
将消耗一个换行符。
我能想到的最好方法是使用扫描集%1[n]
扫描单个换行符。然后扫描换行符以消耗挂起的换行符,并在所需输入之前扫描以获得前导换行符,表示输入完成并退出循环。
第二个循环使用fgets
实现相同的效果。
#include <stdio.h>
#include <stdlib.h>
#define LINE 99
//stringify to use in format string
#define SFS(x) #x
#define FS(x) SFS(x)
int main ( void) {
char text[LINE + 1] = "";
char newline[2] = "";
int result = 0;
while ( 1) {
printf ( "enter text for scanfn");
scanf ( "%*[ tr]"); // scan and discard spaces, tabs, carriage return
if ( 1 == ( result = scanf ( "%1[n]", newline))) {
printf ( "tscanned leading newlinen");
break;
}
if ( 1 == ( result = scanf ( "%"FS(LINE)"[^n]", text))) {
//as needed parse with sscanf, strtol, strtod, strcspn, strspn, strchr, strstr...
printf ( "tscanned text: %sn", text);
scanf ( "%*[ tr]"); // scan and discard spaces, tabs, carriage return
if ( 1 == scanf ( "%1[n]", newline)) {
printf ( "tscanned trailing newlinen");
}
}
if ( EOF == result) {
fprintf ( stderr, "EOFn");
return 1;
}
}
while ( 1) {
printf ( "enter text for fgetsn");
if ( fgets ( text, sizeof text, stdin)) {
if ( 'n' == text[0]) {
printf ( "----newline onlyn");
break;
}
printf ( "----text is:%sn", text);
//as needed parse with sscanf, strtol, strtod, strcspn, strspn, strchr, strstr...
}
else {
fprintf ( stderr, "EOFn");
return 2;
}
}
return 0;
}
scanf
不读取字符串后面的n
,但您可以使用%c
:
#include <stdio.h>
int main() {
char c ;
scanf("%c", &c);
if(c == 'n') {
// ...
}
return 0;
}