[英]Reading characters into a limited buffer size
我有一个程序,接受字符并将它们读入有限大小的缓冲区(在本例中为64)。 如果用户输入的字符超过64个,则必须拒绝整个输入字符串,警告用户输入的字符过多,然后重新开始。 如果用户点击ctrl-D
(文件结尾),则程序必须退出。
因此,我的设计如下:将实际的基础缓冲区设置为65个字符以适应换行符。 如果最后一个字符不是换行符,则用户按ctrl-D
,程序退出。 如果缓冲区已满(即包含65个字符),而最后一个不是换行符,则程序会假定给出了太多字符,因此它将进入循环并不断将输入读入缓冲区,直到缓冲区读取为止in以换行符结尾(在这种情况下,它会警告用户限制并重新开始),或者将其缩短而不会以换行符结尾(在这种情况下,程序将终止)。
我的问题是,我该如何处理用户准确输入65个字符(或65的某个整数倍),然后按ctrl-D
? 按照程序当前的状态,当缓冲区已满并且没有以换行符结尾时,它假定存在溢出,但是在这种情况下,我希望程序终止。 如何在收到65个字符的标量和ctrl-D
的标量倍数后终止程序?
#include <string.h>
#include <unistd.h>
#define BUFSIZE ( 65 )
int main( int argc, char* argv[] ) {
char* prompt = "myshell->";
char* tooMany = "Max characters (64) exceeded.\n";
int numInput;
int done = 0;
char input[ BUFSIZE ];
while( !done ) {
int cont = 0;
write( STDOUT_FILENO, prompt, strlen( prompt ) );
numInput = read( STDIN_FILENO, input, BUFSIZE );
if( input[ numInput - 1 ] == '\n' ) {
cont = 1;
} else {
if( numInput != BUFSIZE ) {
done = 1;
write( STDOUT_FILENO, "\n", strlen( "\n" ) );
} else {
int spill = 1;
while( spill ) {
numInput = read( STDIN_FILENO, input, BUFSIZE );
if( input[ numInput - 1 ] == '\n' ) {
spill = 0;
write( STDOUT_FILENO, tooMany, strlen( tooMany ) );
} else {
if( numInput != BUFSIZE ) {
spill = 0;
done = 1;
write( STDOUT_FILENO, "\n", strlen( "\n" ) );
}
}
}
}
}
/*done ingesting input. Now do something with it...*/
if( cont ) {
write( STDOUT_FILENO, input, numInput );
}
}
return 0;
}
约束:我只可以使用read
和write
功能,但不能从任何<stdio.h>
如果这确实是一个外壳,那为什么不处理更长的数据输入流呢?
如果您的缓冲区限制为65/64字节,则编写“读取/处理或解析文本/读取解析/等”的代码。 环。
最终,当您的代码收到CTRL-D时,然后执行所有解析的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.