PDA

Visualizza la versione completa : [C] printf chiarimenti sul comando ...


visualnic
12-05-2004, 10:35
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

visualnic
12-05-2004, 11:34
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

I'mtheleader
12-05-2004, 17:19
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...

visualnic
12-05-2004, 20:10
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

LeleFT
12-05-2004, 20:30
Questo è il codice corretto:


#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. :ciauz:

visualnic
13-05-2004, 12:52
ok perfetto

ma esattamente cosa fa il comando SWICTH?

perchè hai aggiunto un else?

CIAO E GRAZIE

}gu|do[z]{®©
13-05-2004, 13:59
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


:ciauz:

andrea_NET-_DSL
13-05-2004, 14:40
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 ;)

:ciauz: :D

}gu|do[z]{®©
13-05-2004, 14:53
Originariamente inviato da andrea_NET-_DSL
si una serie di if annidati :)
Lo switch-case lo si usa per evitarli ;)

:ciauz: :D

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

andrea_NET-_DSL
13-05-2004, 15:01
Originariamente inviato da }gu|do[z]{®©
eh.. s el'ho scritto lo so no? :dottò:
che pensi :dottò:
si dicevo per precisare x l'autore del post per fargli conoscere il nome preciso :smack: :gren:

ciao :) :ciauz: :D

Loading