Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    25

    [C]Stringa e posizione del carattere terminatore

    Buonasera,
    sto cercando di fare un programma che, letta una stringa da tastiera, stampi la posizione nell'array del carattere terminatore '\0'.
    Il mio problema è che cosi' risolvo l'esercizio:
    codice:
    #include<stdio.h>
    main()
    {char string[20];
    int i;
    for(i=0;i<20;i++)
    string[i]=' ';
    printf("inserire stringa");
    scanf("%s",string);
    for(i=0;i<20;i++)
    {if(string[i]=='\0')
    printf("La posizione del terminatore è %d\n",i);}
    printf("%s",string);
    getch();}
    mentre in questo modo, che io riterrei equivalente al primo, non funziona (la posizione viene errata):

    codice:
    #include<stdio.h>
    main()
    {char string[20];
    int i,cont;
    printf("inserire stringa: ");
    scanf("%s",string);
    cont=0;
    for(i=0;i<20;i++)
    {if(string[i]!='\0')
    cont++;}
    printf("La posizione del terminatore è %d\n",cont);
    printf("%s",string);
    getch();}
    Come mai si verifica questa cosa?

    Grazie , ciao!!!

  2. #2

    Re: [C]Stringa e posizione del carattere terminatore

    Originariamente inviato da _d4vid3_
    mentre in questo modo, che io riterrei equivalente al primo, non funziona (la posizione viene errata):
    Fammi indovinare: il tuo metodo ti da il terminatore una posizione prima di quello che funziona ?
    lolide
    Java Programmer

    Informati

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    25
    ciao!no no è proprio del tutto "sfasato" ...nel senso che se metto il mio nome (davide) mi da' il terminatore in posizione 14....

    (ps. cmq sono tutti e due miei metodi ...anzi ho pure inventato io l'esercizio )

  4. #4
    Ah non l'avevo visto la prima volta

    Se stringa[i] != '0' incrementa cont
    e se è uguale ?
    O meglio, se è uguale dopo che ha trovato il terminatore ?
    continua ad incrementare cont

    Prova così:
    codice:
    cont = 1;
    for(i=0;i<20;i++) {
      if(string[i]!='\0') 
        cont++;
      else
        break;
    }
    cont fallo partire da 1 sennò ti da una posizione in meno

    lolide
    Java Programmer

    Informati

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    25
    aspetta non ho capito molto bene....
    vuoi dire che le posizioni dell'array dopo il terminatore potrebbero essere occupate da altri caratteri diversi dal terminatore e quindi il contatore continua ad essere incrementato?

    cioe' intendi dire che potrei avere una situazione come la seguente:

    davide\0altricaratteri

    e quindi il contatore viene incrementato piu del dovuto??

  6. #6
    certo è così.
    tu dichiari una stringa di 20 caratteri. quando inserisci una stringa tico con scanf, lui mette davide\0 partendo dalla posizione 0, ma gli altri caratteri esistono ancora.
    lolide
    Java Programmer

    Informati

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    25
    Approfitto della tua pazienza per farti ancora una domanda

    Mi spieghi perchè se scrivo questo programma:

    codice:
    #include<stdio.h>
    main()
    {char string[20];
    int i;
    for(i=0;i<20;i++)
    string[i]='a';
    for(i=0;i<20;i++)
    {if(string[i]=='\0')
    printf("\nLa posizione del terminatore è %d\n",i);}
    printf("%s",string);
    getch();}
    mi stampa a video la sequenza di 'a' seguita da alcuni caratteri "strani" (YA ecc...)?
    inoltre in questo caso qui il terminatore non è presente giusto?

    grazie ancora

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Proprio perchè il terminatore non è presente, lui arriva al 20simo carattere, e non trovando un terminatore, continua a stampare l'area di memoria successiva (che non fa parte della tua stringa, ma di dio solo sa cosa).
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  9. #9
    Originariamente inviato da _d4vid3_
    mi stampa a video la sequenza di 'a' seguita da alcuni caratteri "strani" (YA ecc...)?
    inoltre in questo caso qui il terminatore non è presente giusto?

    grazie ancora
    Tu pensa che stringa è una variabile che occupa 20 byte in memoria.
    La memoria non è tutta inizializzata a 0 (lo è all'avvio del PC, inizializzata al POST del BIOS, ma poi con il caricamento/scaricamento di moduli, dll ecc... dal SO si sporca con valori)
    Il terminatore è semplicemente un valore standard (0x0, che non è 0 il quale è un carattere ascii che vale 0x30 in hex) che usano tutte le funzioni che lavorano con le stringhe (quasi tutte) per identificare che una stringa sia finita.

    Volendo dichiarando una stringa di 20 caratteri (che alla fine è un puntatore) potresti anche accedere al carattere 21 o 22 o 1203123, l'unico problema che incontri è che ci sono alcune locazioni in memoria a cui non puoi accedere, perchè sono protette.
    scanf stampa ogni byte iniziando dal primo di quella stringa, fin quando incontra il terminatore (0x0). se tu inizializzi così la stringa, lui non incontra il terminatore e continua accedendo al carattere 21, 22, 23 ecc.. fin quando non l'incontra.
    lolide
    Java Programmer

    Informati

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    25
    Capito! grazie ancora! a presto ciao!!

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.