Newsgroup: it.comp.lang.c
Titolo: problemi sciarada programma c

sono nuovo del gruppo...avrei un problema
questo è il testo:
Scrivere una funzione che prese in input tre stringhe, A, B e C,
stampi 1 se la stringa
C `e la sciarada delle stringhe A e B. In enigmistica, la sciarada
(
http://it.wikipedia.org/wiki/Sciarada
 %28enigmistica%29 ) `e uno
schema che consi-
ste nell'unire due o pi`u parole per formarne un'altra. Ad esempio la
parola trambusto
`e la sciarada delle due parole tram e busto.
e questa è la mia soluzione
#include <stdio.h>
#define N 50
int sciar (char A[], char B[], char C[], int x, int y);
int main ()
{
    char S[N], D[N], F[N];
    int c;
    scanf("%s", S);
    scanf("%s", D);
    scanf("%s", F);
    for (int i=0; S[i]!='\0';i++)
    for (int j=0; D[j]!='\0';j++)
    for (int k=0; F[k]!='\0'; k++)
    if (k==i+j)
    {
               c=sciar (S, D, F, i, j);
               printf ("%d", c);
    }
    int t;
    scanf ("%d", &t);
    return 0;
}
int sciar (char A[], char B[], char C[], int x, int y)
{
    int a,b;
    for (a=0; a<=x; a++)
    {
        if (A[a]==C[a])continue;
        else return 0;
    }
    for (b=a+1; b<y; b++)
    {
        if (A[b]==C[b])continue;
        else return 0;
    }
    return 1;
}
mi stampa 0 se C non è la sciarada...ma mi stampa non so quanti 1 se
la c è la sciarada...perchè?mi potreste dare una mano?

 (
http://it.wikipedia.org/wiki/Sciarada%28enigmistica%29
 ) `e uno

mi correggo...mi stampa 0 solo se C non è lungo quanto A+B...mi date
una mano?

 una mano?
int sciar(char *sciarada, char *a, char *b, size_t len_a, size_t
len_b) {
        char *aux = NULL;
        size_t len_s = strlen(sciarada);
        if(len_a + len_b != len_s)
                return EXIT_FAILURE;
        aux = calloc(len_a+len_b, 1);
        strncpy(aux, a, len_a);
        strncat(aux, b, len_b);
        if(strncmp(aux, sciarada, len_a + len_b)){
                free(aux);
                return EXIT_FAILURE;
        }
free(aux);
return EXIT_SUCCESS;
}
Salut.

 C `e la sciarada delle stringhe A e B.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *readString(size_t maxLength) {
     char *s = malloc(maxLength+1);
     if (s) {
        size_t len;
        fgets(s, maxLength, stdin);
        len = strlen(s);
        if (s[len-1] == 'n')
          s[len-1] = '

Non so perché, ma newsland si mangia i miei messaggi. Posto da Google:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *readString(size_t maxLength) {
     char *s = malloc(maxLength+1);
     if (s) {
        size_t len;
        fgets(s, maxLength, stdin);
        len = strlen(s);
        if (s[len-1] == '\n')
          s[len-1] = '\0';
     }
     return s;
}
int checkCharade(const char *s1, const char *s2, const char *s3) {
    int result = 0;
    if (s1 && s2 && s3) {
      char *s = malloc(strlen(s1)+strlen(s2)+1);
      if (s) {
        sprintf(s, "%s%s", s1, s2);
        result = (strcmp(s, s3) == 0);
      }
    }
    return result;
}
int main()
{
    char *s1, *s2, *s3;
    printf("insert 1st string: "); s1 = readString(50);
    printf("insert 2nd string: "); s2 = readString(50);
    printf("insert 3rd string: "); s3 = readString(50);
    printf("The string \"%s\" %s a charade!\n", s3,
checkCharade(s1,s2,s3)?"is":"is not");
    free(s1);
    free(s2);
    free(s3);
    return 0;
}

 - Mostra testo tra virgolette -
quindi non si può far nulla senza usare i puntatori?

> quindi non si può far nulla senza usare i puntatori?
Se ti piace di più:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 50
int checkCharade(const char s1[], const char s2[], const char s3[]) {
    int result = 0;
    if (s1 && s2 && s3) {
      char s[MAXLEN*2+1] = {0};
      sprintf(s, "%s%s", s1, s2);
      result = (strcmp(s, s3) == 0);
    }
    return result;
}
int main()
{
    char s1[MAXLEN+1], s2[MAXLEN+1], s3[MAXLEN+1];
    size_t len1, len2, len3;
    printf("insert 1st string: "); fgets(s1, sizeof s1, stdin);
    printf("insert 2nd string: "); fgets(s2, sizeof s2, stdin);
    printf("insert 3rd string: "); fgets(s3, sizeof s3, stdin);
    len1 = strlen(s1);
    len2 = strlen(s2);
    len3 = strlen(s3);
    if (s1[len1-1]=='\n') s1[len1-1]='\0';
    if (s2[len2-1]=='\n') s2[len2-1]='\0';
    if (s3[len3-1]=='\n') s3[len3-1]='\0';
    printf("The string \"%s\" %s a charade!\n", s3,
checkCharade(s1,s2,s3)?"is":"is not");
    return 0;
}

 - Mostra testo tra virgolette -
il mio è proprio sbagliato???volevo capire l'errore...

#include <stdio.h>
#include <string.h>
# define N 50
int sciar (char X[], char Y[], int m);
int main ()
{
    char A[N], B[N], C[N], D[N];
    int i, n, j;
    scanf ("%s", &A);
    scanf ("%s", &B);
    scanf ("%s", &C);
    for (i=0; i!='\0'; i++)
    D[i]=A[i];
    for (n=0; n!='\0'; n++)
    D[i+1]=B[n];
    j= sciar (C, D, i+j);
    printf ("%d", j);
    int t;
    scanf ("%d", &t);
    return 0;
}
int sciar (char X[], char Y[], int m)
{
    int z;
    {
             for (z=0; z<=m; z++)
             {
                 if (X[z]==Y[z])continue;
                 else return 0;
             }
    }
    return 1;
}
ora mi stampa sempre 0...mi dite dov'è l'errore??? perchè stampa
sempre 0...

     scanf ("%s", &A);
Dimenticati le scanf() e usa fgets(). Oltretutto, usi &A mentre dovresti
usare solo A (perché ricordati che il nome di un array decade nel
puntatore al primo elemento, in questo caso). La scanf() ha il problema di
lasciare la sequenza di a capo nel buffer di tastiera, per cui se non si
esegue un'operazione di "pulizia" preliminare, prima della successiva
scanf(), la lettura seguente è immondizia. La funzione fgets(), oltre ad
essere più sicura, non ha di questi problemi. Io ti ho scritto un esempio
in cui si fa uso di fgets(), ma a quanto pare non l'hai neanche guardato.
Consiglio spassionato: andare per tentativi è assolutamente improduttivo.
Focalizza l'algoritmo dentro la tua testa, mettendoti al riparo dai casi
limite e realizzalo. Il problema non dev'essere, per te, che cosa stampa
il codice (con tanto di giri arzigogolati per risolvere questo problema
spicciolo), la scrittura del codice è l'ultimo passo.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


ti rispondo dicendo che sono uno studente universitario, e dato che
non conosco minimamente fgets() non è che non ho proprio visto il tuo
progr, è che non sapevo come facevi a leggere da input la stringa.
comunque l'idea ce l'ho in testa...do in input le 3 stringhe, A, B, e
C memorizzo in D=A+B, controllo se D è lungo quanto C, poi eseguo il
controllo delle lettere...se C==D allora C è la sciarada di A e
B...non penso posso usre fgets() non avendolo fatto a lezione, ecco
perchè chiedo aiuto e non il programma fatto...ti ringrazio molto per
l'aiuto che mi stai dando, davvero dico!
ma se uso la scanf come faccio a cancellare l' a capo...una volta che
comincio col memorizzare A in D mi fermo prima di '\0'dopodiche
continuo a memorizzare in D, B, sempre fermandomi quando il contatore
arriva a '\0', non capisco dove può essere l'errore...tu dici è alla
base nella scanf...l'unico modo è fgets()?sto ricontrollando gli
appunti e ti giuro che prima di oggi non esisteva sta fgets()...

memorizzo in D=A+B, controllo se D č lungo quanto C,
Non serve. Puoi procedere direttamente al confronto delle lettere.
A questo scopo puoi scriverti il rimpiazzo della strcmp(), magari con una
logica piů semplice. Per esempio, potresti chiamare la tua funzione
compareString() e restituire 1 se le stringhe si equivalgono e 0 se sono
differenti.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 


 differenti.
scusami ma questa non l'ho capita...


 scusami ma questa non l'ho capita...
int compareString(const char *a, const char *b) {
    while (*a && *b && *a++==*b++)
      ;
    return (*a==*b);


 questo articolo e` stato inviato via web dal servizio gratuitohttp://
www.newsland.it/newssegnala
 gli abusi ad 
ab...@newsland.it
for (i=0; i!='\0'; i++)
    D[i]=A[i];
    for (n=0; n!='\0'; n++)
    D[i+1]=B[n];
    j= sciar (C, D, i+j);
    printf ("%d", j);
    int t;
    scanf ("%d", &t);
    return 0;
}
int sciar (char X[], char Y[], int m)
{
    int z;
    {
             for (z=0; z<=m; z++)
             {
                 if (X[z]==Y[z])continue;
                 else return 0;
             }
    }
    return 1;
}
quindi al posto di tutto questo ci devo inserire quello? cioè lavoro
coi i puntatori? *o ho capito male?