2017-02-22 5 views
2

Так вот мой код:Как проверить, вводит ли пользователь строковое значение?

main() 
{ 
     char *iochar;                     

     printf(" Enter a standard line: ");                
     scanf ("%s", &iochar); 

     if (iochar != NULL) 
     { 
       printf(" Here's what you entered: %s ", &iochar); 
     } 
     else 
     { 
       printf(" Oops! Looks like you forgot to enter something! "); 
     } 
} 

Моя проблема заключается в том, что я могу сканировать запись пользователя и сохранить его, и если что-то существует, то он выдает правильное сообщение. Но если я просто нажму на возврат, чтобы проверить отсутствие ввода (null, empty и т. Д.), Программа не завершает работу и не выводит мое сообщение об ошибке. Он просто зависает, пока я ничего не введу.

Я программировал на Java в течение последних двух семестров, поэтому C полностью потерян для меня прямо сейчас. Поэтому любая помощь была бы высоко оценена.

+0

, так что вы просто хотите проверить, является ли ввод строкой или нет? –

+4

Не используйте 'scanf' (когда-либо). Используйте 'fgets', или, если у вас есть,' getline'. Затем «just hit return» будет вызывать строку '' \ n "', а команда typing control-D (которая заставляет условие EOF) будет вызывать строку '' ''. Кстати, пробелы на концах вашей второй и третьей строк 'printf' должны быть' \ n'. – zwol

+0

@OusmaneDiaw На данный момент, да. Мой код должен делать другие вещи, но я должен уметь проверять, что на самом деле есть какой-то вход. – Polly

ответ

1

scanf ("%s", &iochar); не полезен для обнаружения пустой строки.

"%s" сначала направляет scanf(), чтобы прочитать и отбросить все ведущие белые пробелы, включая '\n', прежде чем читать символы небелого пробела. Таким образом, код потерял '\n'.


Вместо этого используйте fgets()

// Enough room for 80 characters + \n + \0 
#define LINE_SIZE (80 + 1 + 1) 
char buf[LINE_SIZE]; 

if (fgets(buf, sizeof buf, stdin) == NULL) { 
    puts("end-of-file or input error detected"); 
} else if (buf[0] == '\n') { 
    puts("Empty line entered"); 
} else { 
    printf("Input line: <%s>\n", buf); 
} 

Входной

Hello World (and <Enter>) 

Output (Обратите внимание \ п прочитанный по-прежнему сохраняется)

Input line: <Hello World 
> 

Должно быть ясным: В C строка представляет собой последовательность символов до и заканчивая нулевым символом '\0'. Пользователи не вводят строки. Пользовательский ввод обычно представляет собой строку текста до и заканчивая завершением line feed'\n'. fgets() читает строку ввода, а затем добавляет нулевой символ к результату buffer является строкой `.

+0

О, черт возьми, спасибо! Теперь он работает как сон! Ха-ха. – Polly

0

Вот мой совет: Не используйте scanf. Его правила сбивают с толку, и очень сложно получить нужное поведение. Вместо этого я рекомендую вам использовать getch для ручного чтения каждого символа в буфер до тех пор, пока пользователь не вводит символ новой строки '\n'. Затем вы можете обнулить нулевой буфер с помощью 0, а затем использовать буфер как обычную строку. Чтобы он был пустым, просто проверьте длину строки с помощью strlen(x).

+0

Вы знаете о 'fgets'? –

+0

Да, но я предпочитаю не использовать стандартные библиотечные функции, которые я могу реализовать самостоятельно. – bace1000

Смежные вопросы