У меня есть программа, которая принимает символы и считывает их в буфер ограниченного размера (в данном случае 64). Если пользователь вводит более 64 символов, он должен отклонить всю строку ввода, предупредить пользователя, что они ввели слишком много символов, и начать все заново. Если пользователь нажимает ctrl-D
, это конец файла, программа должна выйти.Чтение символов в ограниченном размере буфера
Итак, моя конструкция такова: сделайте фактический основной буфер 65 символов, чтобы разместить символ новой строки. Если конечный символ не является символом новой строки, пользователь нажимает ctrl-D
, поэтому программа выходит. Если буфер заполнен (т.е. содержит 65 символов), а последний не является символом новой строки, программа предполагает, что было задано слишком много символов, поэтому он переходит в цикл и непрерывно считывает входные данные в буфер до тех пор, пока не будет прочитан буфер в конце с новой строкой (в этом случае он предупреждает пользователя о предельном значении и начинает работу), или он обрезается, не заканчивая новой строкой (в этом случае программа завершается).
Мой вопрос в том, как я могу обрабатывать случай, когда пользователь вводит ровно 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;
}
Constraint: я могу использовать только read
и write
функции, но ничего не из <stdio.h>
.
Я считаю, что вы не должны ограничивать размер строки ввода. Используйте [getline] (http://linux.about.com/library/cmd/blcmdl3_getline.htm) –
@BasileStarynkevitch Да, это сработает, но я могу использовать только системные вызовы для ввода-вывода. – Ataraxia
Затем убедитесь, что вы увеличиваете свой буфер, чтобы всегда соответствовать строке внутри (возможно, используя 'malloc' ...) –