memset () через некоторое время (fgets) - PullRequest
0 голосов
/ 30 октября 2018

Предполагается, что моя программа читает из stdin и передает ввод в систему - в случае, если ввод не равен «выход». Это прекрасно работает, если второй вход не длиннее первого. Например, если первый вход «hello», а второй «hellohello», вход делится на «hello» и «ello». Я предполагаю, что проблема в том, что буфер s не очищается должным образом во время цикла. Поэтому я использовал memset(), но, к сожалению, я не получил результаты, которые искал.

Кто-нибудь может увидеть ошибку?

Большое спасибо!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024

int main(){
char *s = (char *)malloc(MAX);
char *temp = NULL;
while(fgets(s, (sizeof(s)-1), stdin)!= NULL){

    temp = s+(strlen(s)-1);
    *temp = '\0';

    if (strcmp(s,"exit")==0){
         break;
    } else {
        system(s);
    }

    memset(s, 0, MAX);
}
free(s);
return 0;
}

1 Ответ

0 голосов
/ 30 октября 2018

Неправильная вещь здесь (sizeof(s)-1). Это не вернет размер выделенного буфера, вместо этого вернет размер (char*). Ваш размер буфера MAX. memset() действительно ничего с этим не делает, поэтому удалите его. и вам не нужно делать это -1, fgets() всегда будет автоматически присоединять нулевой терминатор в конце строки, даже если буфер заполнен. Также эти две строки

temp = s+(strlen(s)-1);
*temp = '\0';

не нужны, потому что
«fgets() считывает из потока не более одного символа меньшего размера и сохраняет их в буфере, указанном s. Чтение прекращается после EOF или новой строки. Если читается новая строка, она сохраняется в буфер. Завершающий нулевой байт (aq \ 0aq) сохраняется после последнего символа в буфере. "
(из "man fgets", Google для него)

...