2015-09-16 3 views
13

Моя программа может принимать любое количество или пустой ввод. Однако, если вход пуст (пробел или новая строка), программа продолжает ждать ввода. Я также пробовал fgets, но если нажать пробел/новую линию, он все еще ожидает большего ввода, который не является пробелом/новой линией перед закрытием.Принимая пустые строки в C

Simpified код:

#include <stdio.h> 
main(){ 
int num; 
scanf("%i",&num); 
printf("%i",num); 
} 

Вход:

363792 

Выход:

363792 

Желаемая:

Вход:

Выход:

Я новичок в C и я с очень трудно достичь этого.

Что пытались использовать fgets:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
main(){ 

int n; 
char s[20]; 


fgets(s,20,stdin); 
n=atoi(s); 

printf("%i",n); 
} 

Edit: Оказывается, я не компиляции кода правильно. Поэтому каждый раз, когда я пытался вносить изменения, он просто смотрел на исходный код с помощью scanf.

+0

Значит, вы хотите игнорировать пустые входы (пробел или новую строку)? – RDX

+1

Если у вас нет ввода этого вывода кода 0, это ваше желание? – ashiquzzaman33

+2

'scanf' работает не так, как ожидалось, потому что'% d' пропускает символы пробелов. –

ответ

19

Я также попытался fgets, но если пространство/перевод строки нажимается, она по-прежнему ожидает ввода дополнительной, который не является пространством/новой строки перед закрытием.

Во-первых, fgets будет работать в этом случае. Если бы вы показали нам, что именно вы пытались сделать, используя fgets(), тогда ответ на этот вопрос был бы очень узким или очень конкретным.

Я попытался сделать то же самое с помощью fgets(), а ниже - фрагмент кода.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    char string[100]; 
    printf("Enter a number: "); 

    fgets (string, 100, stdin); 
    /* Here remove the trailing new line char; not required unless you are trying to print the string */ 
    string[strlen(string) - 1] = '\0'; 

    printf("Num is %d\n", atoi(string)); 

    return 0; 
} 

Если нет ввода или просто введите или пробел и ввести, то номер, напечатанный будет равен нулю и fgets() не будет ждать, пока вы не введете правильный номер.

Также проверьте это, почему вы не должны использовать получает. Do not use gets()

+0

Я раньше пробовал код. Я просто не понял, что новый код не был скомпилирован :(Спасибо за помощь! Это работает! – JavvaTheHutt

+1

'string [strlen (string) - 1] = '\ 0';' неправильно усекает, когда нет ' \ n''. Это неопределенное поведение, если первый символ является редким встроенным '' \ 0''. Лучше использовать http://stackoverflow.com/a/28462221/2410359 – chux

+1

относительно этой строки: 'string [strlen (string) - 1] = '\ 0'; 'это не будет работать правильно во всех случаях по двум причинам. 1) как упоминалось в chux, если нет новой строки, тогда строка будет повреждена. 2) при запуске под окнами/dos (где новая строка на самом деле является двумя символами) это не удалит новую строку, просто испортит ее. Предложите использовать что-то вроде: 'char * offset = strstr (string," \ n "); if (NULL! = offset) * offset = '\ 0'; ' – user3629249

5

Вы должны прочитать вводимый символ за символом и прекратить чтение, если символ чтения не номер:

char ch; 
while(1) 
{ 
    ch=getchar(); 
    if(isdigit(ch)) 
    { 
     putchar(ch); 
    } 
    else 
    { 
     break; 
    } 
} 
+2

'ch' должен быть' int', так как 'getchar' возвращает' int'. –

7

Согласно определению scanf()

Функция будет читать и игнорировать любые пробелы символы, встречающиеся перед следующим не-пробельным символом.

Таким образом, вы не можете получить желаемый результат, используя scanf(). Как получает() небезопасно, и он плохо работает плохо. вы можете использовать fgets(), чтобы получить ввод и преобразовать его в целое число, если вам нужно использовать atoi().

Здесь пример кода, вы можете попробовать:

#include <stdio.h> 
#include<stdlib.h> 
#include<string.h> 
main() 
{ 
    int num; 
    char ch[100]; 
    fgets(ch, sizeof ch, stdin); 
    if (strlen(ch)>1&& ch[strlen(ch)-1] == '\n') 
    { 
     ch[strlen(ch)-1] = '\0'; 
     num = atoi(ch); 
     printf("%i\n", num); 
    } 
} 
+6

Плохая идея. [Никогда не используйте 'gets()'.] (Http://stackoverflow.com/q/1694036/1679849) –

+0

@Enzo Ferber Просьба пояснить, что «требуется пространство перед типом, чтобы игнорировать пробелы». Конечно, 'scanf ("% d ", ...)' и 'scanf ("% d ", ...)" одинаково сканирует 'int'. – chux

+0

@chux Да, я думал, что снял это. –

1

хорошо, вы не понимаете, что делает scanf(), он идет и сканирует всю строку ввода и ищет специальные символы, такие как% d,% f,% s и до тех пор, пока он не получит то, что находится в строке. Подождите.

scanf("%d %d", a, b); 

будет сделано только тогда, когда вы вводите 2 целочисленные значения, если нажать пространство не сосчитать, как целое значение, поэтому он будет игнорировать его.

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