[C] Hjälp med scanf och nya rader

Permalänk

[C] Hjälp med scanf och nya rader

Hejsan försöker skriva ut mitt namn genom att skanna in en bokstav åt gången
för att skriva ut. Problemet är att den inte tar in mer än 3 bokstäver

#include <stdio.h>

int main(void){

char a, b, c, d, e, f;

printf("ENTER: : : : : :::: \n");

scanf("%c", &a);
printf("one more: ");
scanf("%c", &b);
printf("one more: ");
scanf("%c", &c);
printf("one more: ");
scanf("%c", &d);
printf("one more: ");
scanf("%c", &e);
printf("one more: ");
scanf("%c", &f);

//
// printf(" %c %c %c", a ,b ,c);
// printf(" %c %c %c", d, e, f);
printf(" %c", a);
printf(" %c", b);
printf(" %c", c);
printf(" %c", d);
printf(" %c", e);
printf(" %c", f);
getch();

return 0;
}

output är 3 bokstäver sen avlutar :: :PD

EdiT! har klurat och googlat men hittar inget

Permalänk

jaha nevermind lade just märke till vad som gjorde att det inte fungerade!

Permalänk
Medlem

En bra sak att göra när man själv löser sitt problem, är att berätta vad som felade - så kanske någon med ett liknande problem löser det genom denna tråd. Eller lär sig något i alla fall.

Visa signatur

Vill du att jag besvarar något så kom ihåg att citera mitt inlägg! :)

Permalänk

Berätta gärna vad felet var.

Visa signatur

Asrock Z77 Extreme4 | i5 3570k | 8 GB Corsair Vengeance LP | MSI HD 7870 TF3 | Samsung 830 128 GB | 2 TB Seagate Barracuda | Optiarc AD-7280S | Antec 650W | Fractal Design Arc | HTC One M8

Permalänk
Medlem

Jag har inte jobbat med C, men jag gissar att han tryckte enter för att "avsluta" scanf() och det blev då en newline kvar i inströmmen som fångades upp av nästkommande scanf(), alltså fick han bara chans att mata in något på vartannat anrop.

Permalänk
Medlem

Du skulle kunna använda getchar(); och använda en loop.
EDIT: lägg till fflush(stdin); efter getchar();

char name[6];
int i = 0;

printf("ENTER: : : : : :::: \n");
for ( i = 0; i < 6; i++ ) {
name[i] = getchar();
fflush(stdin);
printf("one more: ");
}

for ( i = 0; i < 6; i++ ) {
printf("%c", name[i]);
getch();
}

Permalänk
Medlem
Skrivet av hivemind:

Jag har inte jobbat med C, men jag gissar att han tryckte enter för att "avsluta" scanf() och det blev då en newline kvar i inströmmen som fångades upp av nästkommande scanf(), alltså fick han bara chans att mata in något på vartannat anrop.

Förmodligen så...

Permalänk
Medlem
Skrivet av Perrish91:

jaha nevermind lade just märke till vad som gjorde att det inte fungerade!

Om du förväntar dig hjälp eller hoppas hitta hjälp via tex google nästa gång du stöter på ett problem så borde du föregå med gott exempel. När du själv hittar en lösning så borde du dela med dig och inte göra som du precis gjort.

Kan tänka mig att du själv skulle blivit en del frustrerad om du tror dig hittat en forumstråd med lösningen på ditt problem och lösningen är "never mind".

Visa signatur
Permalänk
Datavetare

Då lösningen på problemet är rätt enkel är det lika bra att det hamnar i denna tråd.

Orsaken till problemet har redan nämns, det är ju att stdin är en ström av tecken och scanf("%c", &var) kommer läsa nästa tecken, även om det är '\n'.

Detta är vad dokumentationen om scanf säger

Citat:

The format string consists of a sequence of directives which describe how to process the
sequence of input characters. If processing of a directive fails, no further input is read,
and scanf() returns. A "failure" can be either of the following: input failure, meaning that
input characters were unavailable, or matching failure, meaning that the input was inappro‐
priate (see below).

A directive is one of the following:

· A sequence of white-space characters (space, tab, newline, etc.; see isspace(3)).
This directive matches any amount of white space, including none, in the input.

· An ordinary character (i.e., one other than white space or '%'). This character must
exactly match the next character of input.

· A conversion specification, which commences with a '%' (percent) character. A
sequence of characters from the input is converted according to this specification,
and the result is placed in the corresponding pointer argument. If the next item of
input does not match the conversion specification, the conversion fails—this is a
matching failure.

Den mest relevanta informationen är den om "A sequence of white-space...", i detta program vill vi ignorera "white-spaces" och den enda sak som behövs är att lägga in ett <space> i format-strängen till scanf() så programmet ser ut så här

include <stdio.h> int main(void) { char a, b, c, d, e, f; printf("ENTER: : : : : :::: \n"); scanf(" %c", &a); printf("one more:"); scanf(" %c", &b); printf("one more: "); scanf(" %c", &c); printf("one more: "); scanf(" %c", &d); printf("one more: "); scanf(" %c", &e); printf("one more: "); scanf(" %c", &f); printf(" %c", a); printf(" %c", b); printf(" %c", c); printf(" %c", d); printf(" %c", e); printf(" %c", f); return 0; }

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer