Hoe scanf te doen voor enkele char in C

In C:
Ik probeer char van de gebruiker te krijgen met scanfen als ik het uitvoer, wacht het programma niet tot de gebruiker iets typt…

Dit is de code:

char ch;
printf("Enter one char");
scanf("%c", &ch);
printf("%c\n",ch);

Waarom werkt het niet?


Antwoord 1, autoriteit 100%

De conversiespecificatie %czal niet automatisch een voorloopspatie overslaan, dus als er een verdwaalde nieuwe regel in de invoerstroom is (bijvoorbeeld van een eerdere invoer), de scanfoproep zal het onmiddellijk verbruiken.

Een manier om het probleem te omzeilen is om een spatie te plaatsen voor de conversiespecificatie in de format string:

scanf(" %c", &c);

De spatie in de opmaakreeks vertelt scanfom voorafgaande witruimte over te slaan, en het eerste niet-witruimteteken wordt gelezen met de conversiespecificatie %c.


Antwoord 2, autoriteit 11%

Vermijd allereerst scanf(). Het is de pijn niet waard om het te gebruiken.

Zie: Waarom zegt iedereen scanf niet te gebruiken? Wat moet ik in plaats daarvan gebruiken?

Het gebruik van een witruimteteken in scanf()zou een willekeurig aantal witruimtetekens in de invoerstroom negeren. Wat als u meer invoer moet lezen? Overweeg:

#include <stdio.h>
int main(void)
{
   char ch1, ch2;
   scanf("%c", &ch1);  /* Leaves the newline in the input */
   scanf(" %c", &ch2); /* The leading whitespace ensures it's the
                          previous newline is ignored */
   printf("ch1: %c, ch2: %c\n", ch1, ch2);
   /* All good so far */
   char ch3;
   scanf("%c", &ch3); /* Doesn't read input due to the same problem */
   printf("ch3: %c\n", ch3);
   return 0;
}

Hoewel de 3e scanf() op dezelfde manier kan worden hersteld met een voorloopspatie, gaat het niet altijd zo eenvoudig als hierboven.
Een ander groot probleem is dat scanf()geen invoer in de invoerstroom weggooit als deze niet overeenkomt met het formaat. Als u bijvoorbeeld abcinvoert voor een intzoals: scanf("%d", &int_var);en vervolgens abczal moeten lezen en weggooien. Overweeg:

#include <stdio.h>
int main(void)
{
    int i;
    while(1) {
        if (scanf("%d", &i) != 1) { /* Input "abc" */
            printf("Invalid input. Try again\n");
        } else {
            break;
        }
    }
    printf("Int read: %d\n", i);
    return 0;
}

Een ander veelvoorkomend probleem is het mengen van scanf()en fgets(). Overweeg:

#include <stdio.h>
int main(void)
{
    int age;
    char name[256];
    printf("Input your age:");
    scanf("%d", &age); /* Input 10 */
    printf("Input your full name [firstname lastname]");
    fgets(name, sizeof name, stdin); /* Doesn't read! */
    return 0;
}

De aanroep van fgets()wacht niet op invoer omdat de nieuwe regel die is achtergelaten door de vorige scanf()-aanroep wordt gelezen en fgets() beëindigt het lezen van de invoer wanneer deze een nieuwe regel tegenkomt.

p>

Er zijn veel andere soortgelijke problemen verbonden aan scanf(). Daarom wordt het over het algemeen aanbevolen om het te vermijden.

Dus, wat is het alternatief? Gebruik fgets()functie in plaats daarvan Op de volgende manier om een ​​enkel teken te lezen:

#include <stdio.h>
int main(void)
{
    char line[256];
    char ch;
    if (fgets(line, sizeof line, stdin) == NULL) {
        printf("Input error.\n");
        exit(1);
    }
    ch = line[0];
    printf("Character read: %c\n", ch);
    return 0;
}

One Detail om op te letten bij gebruik van fgets()zal lezen in het nieuwe lijnteken als er voldoende ruimte is in de Inut-buffer. Als het niet wenselijk is, dan kunt u het verwijderen:

char line[256];
if (fgets(line, sizeof line, stdin) == NULL) {
    printf("Input error.\n");
    exit(1);
}
line[strcpsn(line, "\n")] = 0; /* removes the trailing newline, if present */

3, Autoriteit 3%

Dit werkt voor mij Probeer het uit

int main(){
char c;
scanf(" %c",&c);
printf("%c",c);
return 0;
}

Antwoord 4

fgets noch getchar werken om het probleem op te lossen.
de enige oplossing is om een spatie voor %c te houden tijdens het gebruik van scanf
scanf(” %c”,ch); // werkt alleen

Hierna werken fgets ook niet..

char line[256];
char ch;
int i;
printf("Enter a num : ");
scanf("%d",&i);
printf("Enter a char : ");
if (fgets(line, sizeof line, stdin) == NULL) {
    printf("Input error.\n");
    exit(1);
}
ch = line[0];
printf("Character read: %c\n", ch);

Antwoord 5

probeer getchar(); in plaats daarvan

syntaxis:

void main() {
    char ch;
    ch = getchar();
}

Antwoord 6

Vóór de scanf plaats fflush(stdin);om de buffer te wissen.


Antwoord 7

De enige code die voor mij werkte, is:

scanf(" %c",&c);

Ik had hetzelfde probleem, en alleen met losse tekens. Na een uur willekeurig testen kan ik nog geen probleem melden. Je zou denken dat C nu een kogelvrije functie zou hebben om afzonderlijke tekens van het toetsenbord te halen, en niet een reeks mogelijke hackarounds… Gewoon zeggen…


Antwoord 8

Voorziet in een spatie vóór %c conversiespecificatie zodat de compiler spaties negeert. Het programma kan als volgt worden geschreven:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char ch;
    printf("Enter one char");
    scanf(" %c", &ch); /*Space is given before %c*/
    printf("%c\n",ch);
return 0;
}

Antwoord 9

Gebruik string in plaats van char
zoals

char c[10];
scanf ("%s", c);

Ik geloof dat het goed werkt.


Antwoord 10

U moet een geldige variabele gebruiken. chis geen geldige variabele voor dit programma. Gebruik char Aaa;

char aaa;
scanf("%c",&Aaa);

Getest en het werkt.

Other episodes