Citirea unui singur caracter în C (Programare, C, Scanf)

g3d a intrebat.

Încerc să citesc un caracter din consolă (în interiorul unei bucle while loop). Dar se citește de mai multe ori.

Intrarea:

a

Ieșire:

char : a  char : char : '

Cod:

while(..)
{
    char in;
    scanf("%c",&in);
}

Cum pot citi doar ‘a’?

5 răspunsuri
P.P
scanf("%c",&in);

lasă o linie nouă care este consumată în următoarea iterație.

Schimbați-l în:

scanf(" %c",&in); // Notice the whitespace in the format string

care îi spune lui scanf să ignore spațiile albe.

SAU

scanf(" %c",&in);
getchar(); // To consume the newline 

Comentarii

  • De fapt, vreau să creez o matrice de caractere.Aveți vreo idee în acest sens? (Dimensiunea de intrare este incertă).Mulțumesc! –  > Por g3d.
  • @vkeles: 1) Alocați un array cu o anumită dimensiune inițială, să zicem n folosind malloc 2) Citiți caracterele în matrice până când aceasta nu depășește n 3) Dacă n sunt citite caracterele și doriți să citiți mai mult decât dublul dimensiunii array-ului folosind realloc. Această metodă este urmată în general pentru a evita apelarea prea frecventă a realocării. În caz contrar, puteți face realocarea cu dimensiunea preferată. –  > Por P.P.
Douglas

Pentru a citi doar un singur caracter, utilizați getchar în schimb:

int c = getchar();
if (c != EOF)
  printf("%c
", c);

Manolis Ragkousis

în scanf("%c",&in); ați putea adăuga după %c un caracter de linie nouă
pentru a absorbi caracterele suplimentare

scanf("%c
",&in);

umsee

ați putea folosi întotdeauna char a = fgetc (stdin);. Neconvențional, dar funcționează la fel ca getchar().

Cocoo Wang

puteți face așa.

char *ar;
int i=0;
char c;
while((c=getchar()!=EOF)
   ar[i++]=c;
ar[i]='';

în acest fel, creați un șir de caractere, dar de fapt este o matrice de caractere.

Comentarii

  • Rețineți că acest exemplu nu alocă nicio memorie pentru matricea de caractere și nici nu stabilește valoarea inițială a lui ar, astfel încât va scrie într-o locație efectiv aleatorie în memorie, suprascriind ceea ce se află acolo. –  > Por Douglas.
  • Mulțumesc.Chiar am uitat să păstrez obiceiul de a inițializa o variabilă pointer –  > Por Cocoo Wang.

Tags:,