1

我有一个程序,它接收字符并将它们读入有限大小的缓冲区(在本例中为 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;
}

约束:我只能使用readandwrite函数,但不能使用<stdio.h>.

4

2 回答 2

0

你真的应该接受任意大小的线条。请注意,读取tty(例如在终端中)与读取某些管道不同。(伪tty-s 是一个复杂的主题:一些行缓冲发生在内核中)。

而且你应该有一些缓冲 - 你通常可能有read比你需要的更多的字节,所以将额外的字节保留在缓冲区中以备将来使用。

所以你应该malloc缓冲区(并在太小时重新分配它)。如果您的老师不允许malloc,请使用您自己的分配器mmap

仔细阅读 read(2)手册页。不要忘记它可以在错误时返回 -1,在文件结束时返回 0,或者一些计数成功。

于 2013-08-11T06:56:26.937 回答
-3

如果这真的是一个外壳,那么为什么不处理更长的数据输入流呢?

如果您的缓冲区限制为 65/64 字节,则编写“读取/处理或解析文本/读取解析/等”。环形。

当最终您的代码收到 CTRL-D 时,然后执行所有解析的结果。

于 2013-08-11T06:43:54.600 回答