Как обнаружить пустую строку из fgets

Я пытаюсь определить ввод fgets со стандартного ввода как пустой (когда я нажимаю ввод, ничего не вводя). Вот моя программа:

int main()
{
    char input[1000];
    printf("Enter :");
    fgets(input, 1000, stdin);
    input[strlen(input) - 1] = '\0';

    if(input != '\0'){
        printf("hi");
    }

    return 0;

}

Я хочу сделать какое-то условие, при котором он ничего не печатает, но очевидно, что этот способ неверен. Я также пробовал NULL, но это не сработало.

Спасибо!


person KWJ2104    schedule 08.11.2011    source источник
comment
@JamesMcNellis На самом деле эта строка никогда ничего не сделает, независимо от того, откуда взялась input. Функция strlen просто ищет первые '\0' в строке, поэтому по определению input[strlen(input) - 1] == '\0'. Единственное, что он может изменить, это введение segfault, если input не завершается нулем и за ним не следуют какие-либо '\0' до исчерпания адресного пространства вашей программы.   -  person Aaron Dufour    schedule 09.11.2011


Ответы (4)


Я думаю, что это наиболее читаемый (но не производительный):

if (strlen(input) != 0) {
    printf("hi");
}

Но ради учения вот твой стиль, но потом исправлено:

if (input[0] != '\0') {
    printf("hi");
}

Почему input[0]? Потому что input действует как указатель на первый элемент массива, если вы сравниваете его таким образом, и вам сначала нужно разыменовать его, чтобы сделать сравнение полезным.

person orlp    schedule 08.11.2011
comment
+1, но input — это массив, а не указатель на массив. В контексте этого сравнения он превращается в указатель, но важно проводить различие. - person Carl Norum; 09.11.2011
comment
Да, но вы отредактировали то же самое (неправильное) утверждение. Массивы и указатели — это не одно и то же, хотя в данном конкретном случае они взаимозаменяемы. - person Carl Norum; 09.11.2011
comment
массивы являются указателями, если вы относитесь к ним как к таковым. Нет, массив может использоваться в качестве указателя, но это не означает, что он является указателем. - person James McNellis; 09.11.2011

Очевидным способом было бы что-то вроде:

if (input[0] != '\0')
   printf("hi");

Хотя использование strlen будет работать, потенциально оно весьма расточительно — оно превращает операцию O(1) в O(N).

person Jerry Coffin    schedule 09.11.2011

fgets вернет '\n' при нажатии клавиши возврата; это делает общую строку "\n\0". Вы можете выполнить сравнение строк с этим значением, но более надежным решением является «обрезать» или «обрезать» строку, чтобы удалить все начальные и конечные пробелы (что вы должны сделать в любом случае перед любой обработкой), а затем проверить наличие пустой строки. .

Самая простая модификация — проверить, (*input!='\n'). Я должен отметить, что это также требует, чтобы вы удалили код, заканчивающийся нулем, который удаляет эту новую строку (предположительно, по замыслу).

person Robert    schedule 09.11.2011

Чтобы быть в безопасности, лучше использовать это:

if(u_input[0] == '\n' && u_input[1] == '\0'){
    printf("hi");
}
person rockster4c    schedule 09.02.2016