由于我发现fflush(stdin)不是一种可移植的方式来处理熟悉的"新行潜伏在输入缓冲区中"的问题,所以当我必须使用时,我一直在使用以下内容scanf:
while((c = getchar()) != '\n' && c != EOF);
Run Code Online (Sandbox Code Playgroud)
但今天我偶然发现了我在cflplus.com上关于fflush注意到的这一行:
fflush()...在打开以进行更新的文件中(即,打开以进行读取和写入),在执行输入操作之前,应在输出操作之后刷新流.这可以通过重新定位(fseek,fsetpos,rewind)或通过显式调用fflush来完成
事实上,我已经多次阅读过了.所以我想确认一下,我是否可以简单地使用以下任何一种方法,scanf()以便在fflush(stdin)支持时提供同样的服务:
fseek(stdin,1,SEEK_SET);
rewind(stdin);
Run Code Online (Sandbox Code Playgroud)
PS rewind(stdin)似乎非常安全,可以刷新缓冲区,我错了吗?
错误我应该提到,fseek(stdin,0,SEEK_SET)如果我们正在讨论,stdin因为我们不能使用0或0之外的任何偏移量ftell().
我想在我的c程序中读取箭头按键并用其他字符串替换它们(立即在终端本身中).我正在尝试在unix终端中实现bash历史记录功能.我写了这段代码.
int
main(int argc, char *argv[])
{
char c;
char str[1024];
int i = 0;
while((c = fgetc(stdin)) != '\n'){
if(((int)c) == 27){
c=fgetc(stdin);
c=fgetc(stdin);
if (c == 'A')
{
printf("%c[A%c[2K",27, 27);
printf("UP");
}
}
str[i++] = c;
}
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为终端等待换行符或EOF将输入缓冲区发送到stdin.所以,我必须按回车键/返回键来分析用户输入.
在这个答案中,用户提到使用system ("/bin/stty raw");但这取代了所有默认的终端行为(例如退格,删除等).
那么,有没有什么方法可以直接读取/操作终端输入缓冲区并在检测到箭头按键时调整缓冲区本身?
环境 - Ubuntu(Linux)
更新1:是否有更改信号/中断的方法(默认是按输入键),使终端将存储的输入发送到缓冲区?这也可以帮助我实现相同的行为.
最终守则:
我通过检查输出来找到特定按键的ASCII字符 strace bash
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#define ESCAPE '\33'
#define BACKSPACE '\177'
#define …Run Code Online (Sandbox Code Playgroud) 基本信息
目标SDK版本28
目标:课程的目标是在发送到我的服务器之前调整视频大小。
问题:应用程序仅在 API 29 上崩溃,无论是使用真实设备还是使用 AVD。例如,该代码在Pixel 2 API 28上运行良好,但在Pixel 2 API 29上运行不佳
源代码:我主要使用来自bigflake.com的示例代码。
错误信息(详细日志见下文):
E/AndroidRuntime: FATAL EXCEPTION: Thread-20
Process: com.myapp.myapp, PID: 9189
android.media.MediaCodec$CodecException: Error 0xfffffff3
at android.media.MediaCodec.native_queueInputBuffer(Native Method)
at android.media.MediaCodec.queueInputBuffer(MediaCodec.java:2450)
Run Code Online (Sandbox Code Playgroud)
我尝试过的
由于 的日志信息有限,我尝试从 更改为MediaCodec$CodecException,但没有成功。MediaCodecInfo.CodecCapabilities.COLOR_FormatSurfaceMediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible
日志将显示最后两个缓冲周期。我希望你能看到一些有价值的东西。
D/VideoResolutionChanger: no audio encoder output buffer
D/VideoResolutionChanger: loop: V(true){extracted:49(done:false) decoded:45(done:false) encoded:43(done:false)} A(true){extracted:45(done:false) decoded:44(done:false) encoded:1(done:false) pending:-1} muxing:true(V:0,A:1)
D/VideoResolutionChanger: video decoder: returned input buffer: 3
video …Run Code Online (Sandbox Code Playgroud) android video-encoding input-buffer mediamuxer android-mediacodec
我试图从用户输入两个字符t.这是我的代码:
int main()
{
int t;
scanf("%d",&t);
char a,b;
for(i=0; i<t; i++)
{
printf("enter a: ");
scanf("%c",&a);
printf("enter b:");
scanf("%c",&b);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,第一次输出是:
enter a:
enter b:
Run Code Online (Sandbox Code Playgroud)
也就是说,代码不等待值a.
scanf()我的程序中的输入缓冲区有问题。
首先我要求用户输入:
char someVariable;
printf("Enter text: ");
scanf(" %c",&someVariable);
Run Code Online (Sandbox Code Playgroud)
然后我有一个循环,一次遍历输入一个字符,scanf()直到到达换行符。
问题是,循环完成后,不知何故,缓冲区中仍然有一些东西,因此这个函数(在循环中被调用)被再次调用并破坏了我程序中的逻辑。
如何强制清除输入缓冲区?
我只能使用scanf()(作业要求)
void checkType(){
char userInput;
char tempCheckInput;
printf("Enter Text: ");
scanf(" %c",&userInput);
while (userInput != '\n'){
tempCheckInput = userInput;
scanf("%c",&userInput);
Run Code Online (Sandbox Code Playgroud)
忽略循环结束;这是我获取输入的部分。
这是一个代码片段。我对内部缓冲的工作方式感到困惑。
while(true)
{
cout << "Enter a character: ";
cin.ignore(3, '\n');
ch = cin.get(); // ch is char type
cout << "char: ch: " << ch << endl;
}
Run Code Online (Sandbox Code Playgroud)
实际上cin.ignore(3, '\n')忽略前三个字符,然后获取下一个直接字符。到那一点就好了。因为,我把它保持在一个while循环中,我试图检查ignore()and的行为get()。例如,我检查的输出是
Enter a character: abcd
char: ch: d
Enter a character: efgh
char: ch: e
Enter a character: ijkl
char: ch: i
Enter a character: mnopq
char: ch: m
Enter a character: char: ch: q
Enter a character:
Run Code Online (Sandbox Code Playgroud)
只是为了检查缓冲,我故意给了 4 个字符而不是 1 …
input-buffer ×6
c ×4
scanf ×2
android ×1
c++ ×1
character ×1
fflush ×1
fseek ×1
input ×1
inputstream ×1
linux ×1
mediamuxer ×1
stdin ×1