Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C] printf chiarimenti sul comando ...

    ho il seguente codice:

    -------------------------------------------------------------------
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main()
    {
    char str[255];
    char par1[50],par2[50],par3[50],par4[50];
    /* 'parn' dove n e il numero di parole che si vuole memorizare */
    int n=1,i,c;

    printf("Inserisci la stringa: ");
    gets(str);

    for(i=0,c=0;str[i]!='\0';i++,c++)
    {
    if(str[i]!=' ')
    {
    switch(n){
    case 1:
    par1[c]=str[i];
    break;
    case 2:
    par2[c]=str[i];
    break;
    case 3:
    par3[c]=str[i];
    break;
    case 4:
    par4[c]=str[i];
    break;
    default:
    printf("Frase lunga");
    break;
    exit(1);
    }
    printf("%c",str[i]); /*questo funziona*/

    }
    else
    {
    n++;
    c=-1;
    printf("\n");

    }
    }
    getchar();
    printf("%s", par1); /*questo mi da dei risultati seguiti da ? o da numeri*/
    getchar();
    }

    ---------------------------------------------------------------

    Ho un problema con i due printf

    come mai il primo printf funziona correttamente stampandomi a video le quattro parole,

    invece il secondo quando gliene faccio stampare soltanto una mi stampa la stringa par1 ma seguita dai dei numeri o dei punti di domanda?

    GRAZIE CIAO

    ps questo codice è una rielaborazione del codice fornitomi da AKIRA86
    GRAZIE ANCORA

    CIAO

  2. #2
    Dipende da cosa scrivo:

    se la prima parola è più lunga di 3 caratteri, il secondo printf mi da un risultato tipo: nic9?

    se invece la prima parola è di esattamente 3 caratteri va bene

    SARA' UN PROBLEMA DEL COMPILATORE IO USO DEV C++ 4.9

    CIAO

    GRAZIE

  3. #3
    No non è il compilatore...

    Alla fine di ogni stringa tu per chiuderla devi metterci il carattere NULL o '\0'...

    Di solito acquisendo con scanf alla stringa viene automaticamente applicata alla fine il carattere di fine stringa \0.

    In quel caso acquisendo carattere per carattere il carattere di fine stringa non viene messo e lo devi mettere tu...

    quindi se la stringa è lunga tre tu dovrai fare..

    str[3]='\0';

    così la stringa non va ad invadere un altra stringa in memoria e non hai numeri o simboli strani alla fine della stringa...

    ciao ciao

    P.S. l'ho provato sul tuo code e tutto funziona...
    "Penso che nel mondo ci sia mercato per quattro o cinque computer"... Thomas Watson, presidente della IBM, 1943

  4. #4
    io non conosco a priori quanto può essere lunga la prima parola della stringa inserita

    al massimo possono essere quattro parole di 50 caratteri ognuna ...

    non ho capito quello che hai provato tu

    il carattere che mi dice che una parola è finita è lo spazio " " è giusto?

    mi spiego meglio:

    se la mia stringa è composta da due parole separate da uno spazio e la prima parola è lunga 3 caratteri il programmino funge, invece se è più lunga mi da un risultato strano, io voglio risolvere il problema che la prima parola può essere lunga anche 15 20 30 caratteri e il risultato del secondo printf sia esatto come il primo ...

    GRAZIE A TUTTI CIAO

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Questo è il codice corretto:
    codice:
    #include <windows.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    
    int main() { 
       char str[255]; 
       char par1[50],par2[50],par3[50],par4[50]; 
    
       /* 'parn' dove n e il numero di parole che si vuole memorizare */ 
       int n=1,i,c; 
    
       printf("Inserisci la stringa: "); 
       gets(str); 
    
       for(i=0,c=0;str[i]!='\0';i++,c++) { 
          if(str[i]!=' ') { 
             switch(n){ 
                case 1: 
                   par1[c]=str[i];
                   break; 
                case 2: 
                   par2[c]=str[i]; 
                   break; 
                case 3: 
                   par3[c]=str[i]; 
                   break; 
                case 4: 
                   par4[c]=str[i]; 
                   break; 
                default: 
                   printf("Frase lunga"); 
                   break; 
             } 
             printf("%c",str[i]); 
          } else { 
             switch(n){ 
                case 1: 
                   par1[c]='\0';
                   break; 
                case 2: 
                   par2[c]='\0'; 
                   break; 
                case 3: 
                   par3[c]='\0'; 
                   break; 
                case 4: 
                   par4[c]='\0'; 
                   break; 
                default: 
                   break; 
             }
             n++; 
             c=-1; 
             printf("\n"); 
          } 
       } 
       getchar(); 
       printf("%s", par1); 
       getchar(); 
    }
    PS: l'istruzione exit(1) che hai messo risulta inutile in quanto non verrà mai eseguita... è preceduta da un break; !

    Il codice si poteva ridurre facendo uso di un array bidimensionale al posto di avere 4 array monodimensionali, ma credo che sia argomento futuro...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    ok perfetto

    ma esattamente cosa fa il comando SWICTH?

    perchè hai aggiunto un else?

    CIAO E GRAZIE

  7. #7
    swith è un condizionale a più rami...

    equivale ad una serie di if/else

    ovvero esamina il valore n ed esegue ill codice che corrisponde al "case" [overo al valore] effettivo



  8. #8
    Originariamente inviato da }gu|do[z]{®©
    swith è un condizionale a più rami...

    equivale ad una serie di if/else
    si una serie di if annidati
    Lo switch-case lo si usa per evitarli

    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  9. #9
    Originariamente inviato da andrea_NET-_DSL
    si una serie di if annidati
    Lo switch-case lo si usa per evitarli

    eh.. s el'ho scritto lo so no?
    che pensi

  10. #10
    Originariamente inviato da }gu|do[z]{®©
    eh.. s el'ho scritto lo so no?
    che pensi
    si dicevo per precisare x l'autore del post per fargli conoscere il nome preciso :gren:

    ciao
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

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.