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

    [C] Problemi nel memorizzare e ricopiare parole

    Piccolo problema: stavo provando ad utilizzare questo codice per ottenere in memoria una parola e ricopiarla


    #include<stdio.h>
    #include<stdlib.h>
    #define MAX 100
    main()
    {
    char nome[MAX];
    int i, j;
    for(i=0; nome[i]=getchar()!='\n'; i++) {
    }
    for(j=0; j<=i; j++){
    printf("%c", nome[j]);
    }
    system("pause");
    }
    Ma quando ricopia la stringa mi riporta una serie di simboli simili ad uno smile sorridente ( ) come mai ?

  2. #2
    codice:
    #include<stdio.h>
    
    #define MAX 100
    int main(void)
    {
    	char nome[MAX];
    	int i, j;
    	for(i=0; (nome[i]=getchar())!='\n'; i++)
    		;
    	nome[i]=0;
    	for(j=0; j<=i; j++)
    		printf("%c", nome[j]);
    	return 0;
    }
    Il tuo errore fondamentale era di mettere
    codice:
    nome[i]=getchar()!='\n'
    invece di
    codice:
    (nome[i]=getchar())!='\n'
    ; infatti l'operatore != aveva la precedenza ed era il risultato del confronto getchar()!='\n' ad essere assegnato a nome[i]. Tale risultato, fino a quando getchar() non restituiva '\n', era uguale a 1, carattere che nel codepage OEM viene rappresentato come uno smile sorridente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Grazie (anche se me n'ero accorto subito dopo aver chiesto sul forum ) Comunque, potresti dirmi se sono molto influenti l'aggiunta del ; essendo il for vuoto e l'aggiunta di

    nome[i]=0;

    ?

  4. #4
    L'aggiunta del ; è semplicemente una mia preferenza per i cicli vuoti rispetto al {}, ma è del tutto ininfluente. Il nome[i]=0; invece è fondamentale se intendi usare nome con funzioni che richiedono normali stringhe ASCIZ (array di char terminate dal carattere NUL). Nel contesto del programma, a ben vedere, non serve visto che usi nome come una counted string, stampando i caratteri basandoti sul numero di caratteri presenti invece che sul terminatore NUL.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    Due informazioni:

    solitamente ho sempre visto NULLterminare le stringhe con '\0' e non con 0 ??
    non credo sia la stesa cosa, quindi mi chiedo quale sia la differenza.


    codice:
    for(j=0; j<=i; j++)
    in questo modo si va a stampare anche l'ultimo carattere array[i],
    in questo caso impostato a 0. anche qui ho dei dubbi sull'utilità.

    Grazie a chi vorrà rispondere.
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  6. #6
    codice:
      char c ;
      c = '\0';
    // e
      c = 0;
    // e
      c = NULL;
    // sono perfettamente identiche

  7. #7
    '\0' e 0 sono perfettamente identici, infatti la sequenza di escape '\numero' si traduce semplicemente come numero (dove numero viene considerato come unsigned char).
    NULL invece non mi pare che sia necessariamente uguale a '\0', e comunque un libro che ho letto sostiene che è un simbolo concettualmente diverso; se il carattere NUL ('\0' o 0 o ^@ o quello che vuoi) rappresenta il terminatore delle stringhe ASCIIZ la costante NULL invece è il valore da assegnare ai puntatori non inizializzati.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    normalmente NULL è definito da una macro, che potrebbe somigliare a questa
    codice:
    #ifndef NULL
    #if defined(_KERNEL) || !defined(__cplusplus)
    #define NULL    ((void *)0)
    #else
    #if defined(__LP64__)
    #define NULL    (0L)
    #else
    #define NULL    0
    #endif  /* __LP64__ */
    #endif  /* _KERNEL || !__cplusplus */
    #endif
    Hai ragione, normalmente NULL è utilizzata per identificare una locazione di memoria non valida, ma il suo valore non vedo come possa esere differente da zero.
    ciao
    sergio

  9. #9
    Teoricamente forse lo potrebbe essere, ma all'atto pratico concordo con te che è sempre uguale a zero; la distinzione che facevo in ogni caso era puramente concettuale.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.