Подтвердить что ты не робот

Принятие пустых строк в C

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

Упрощенный код:

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

Input:

363792 

Вывод:

363792

Желаемый:

Input:

Вывод:

Я новичок в 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.

4b9b3361

Ответ 1

Я также испробовал 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() не будет ждать, пока вы не введете допустимый номер.

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

Ответ 2

В соответствии с определением 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);
    }
}

Ответ 3

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

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

Ответ 4

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

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

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