Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] "scanf("%c" , c) non funziona?"

    Scusate per la domanda che potrebbe sembrare banale...
    Io non capisco perchè questo codice funziona a metà!

    __________________________________________________ ___________
    #include <stdio.h>
    #include <malloc.h>

    main()
    {
    char* array;
    char c;

    array=(char*)malloc(sizeof(char)*10);
    printf("Inserisci elementi dell' array\n");

    scanf("%s", array);

    printf("%s\n", array);

    printf("Inserisci un carattere\n");
    scanf("%c", & c);
    printf("Carattere = ");
    printf("%c\n", c);

    free(array);
    }
    __________________________________________________ ___________

    Funziona a metà nel senso che l'array viene allocato, lo riempio e stampoil contenuto correttamente, invece questa parte:

    printf("Inserisci un carattere\n");
    scanf("%c", & c);
    printf("Carattere = ");
    printf("%c\n", c);

    non funziona!
    Non funziona nel senso che non si ferma a chiedere l'immissione del carattere e di conseguenza non lo stampa... Invece se nel sorgente scrivo solo questo ed elimino la parte di codice riguardante l'array e ricompilo tutto funziona e anche questa parte funziona (a dimostrare che non ho fatto errori di sintassi!)...

    Qual'è il problema?
    Grazie a tutti

  2. #2
    La prima scanf() non preleva il codice del carattere di invio
    la seconda lo trova nel buffer di stdin, lo preleva e lo assegna alla
    variabile c, senza attendere ulteriori immissioni da parte dell'utente...
    codice:
    #include <stdio.h>
    #include <malloc.h>
    
    int main()
    {
    	char *array;
    	char c;
    
    	array=(char*)malloc(sizeof(char)*10);
    	printf("Inserisci elementi dell' array\n");
    
    	scanf("%s", array);
    
    	printf("%s\n", array);
    	// Svuoto il buffer....
    	while( getchar()!='\n');
    	printf("Inserisci un carattere\n");
    	scanf("%c", &c);
    	printf("Carattere = %c\n", c);
    
    	free(array);
    	return 0;
    }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Quindi se non erro, "getchar()" infila nel buffer il carattere e scanf() lo preleva dal buffer infilandolo nella variabile . Non lo sapevo... La cosa è nata dal fatto che conosco sufficientemente solo il C++ e in quel linguaggio la cosa è molto semplificata...basta un semplice "cin>>" per acquisire praticamente qualunque cosa!

    Grazie mille Samuele_70 !

  4. #4
    Originariamente inviato da darknessone
    Quindi se non erro, "getchar()" infila nel buffer il carattere
    Assolutamente no, la getchar() si comporta come una scanf("%c", &var);
    Preleva cioè un carattere da stdin.
    e scanf() lo preleva dal buffer infilandolo nella variabile . Non lo sapevo... La cosa è nata dal fatto che conosco sufficientemente solo il C++ e in quel linguaggio la cosa è molto semplificata...basta un semplice "cin>>" per acquisire praticamente qualunque cosa!

    Grazie mille Samuele_70 !
    Per il C++ vale lo stesso discorso
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Allora mi sa che ho un pò di confusione in testa...è solo che il C lo sto leggendo da ieri!
    Dunque che differenza c'è tra "getchar()" e "scanf()"?? E' la stessa differenza che c'è in C con "cin.get()" e "cin>>" ??? O c'è qualcosa di più??

  6. #6
    Originariamente inviato da darknessone
    Allora mi sa che ho un pò di confusione in testa...è solo che il C lo sto leggendo da ieri!
    Dunque che differenza c'è tra "getchar()" e "scanf()"?? E' la stessa differenza che c'è in C con "cin.get()" e "cin>>" ??? O c'è qualcosa di più??
    Ci sono alcune differenze
    codice:
    #include <iostream>
    using namespace std;
    int main()
    {
    	char a;
    	scanf("%c", &a);
    	char b;
    	b=getchar();
    	char c;
    	c=cin.get();
    	char d;
    	cin>>d;
    	cout<<"a="<<(int)a<<" b="<<(int)b<<" c="<<(int)c<<" d="<<(int)d<<endl;
    	return EXIT_SUCCESS;
    }
    Fai alcune prove, ad esempio, cambia l'ordine di questa sequenza di istruzioni.
    e vedi cosa cambia.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Grazie! Cmq sarà una mia impressione ma il C è molto macchinoso!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.