2017-04-24 1 views
0

Des pointeurs plutôt que des réponses directes si vous voulez.Pourquoi "a" met-il prématurément fin à cette boucle?

Cette boucle effectue une manipulation sur les caractères et génère un texte chiffré c basé sur une clé k et du texte en clair p. Lorsque 'a' ou 'A' apparaît dans le texte en clair, le programme affichera cette lettre comme prévu, mais mettra fin prématurément à la boucle.

p devient tout à coup un seul caractère long, ce caractère étant 1.

while (i < strlen(p)) 
{ 
    char stdp = p[i]; 
    char stdk = k[j]; 

    if (isalpha(stdp)) 
    { 
     if (islower(stdp)) 
     { 
      p[i] = stdp - 'a'; 
      Aa = 0; 
     } 
     else 
     { 
      p[i] = stdp - 'A'; 
      Aa = 1; 
     } 

     if (islower(k[j])) 
     { 
      k[j] = stdk - 'a'; 
     } 
     else 
     { 
      k[j] = stdk - 'A'; 
     } 
    } 

    if (isalpha(stdp)) 
    { 
     c[i] = ((p[i] + k[j]) % 26); 
    } 
    else 
    { 
     c[i] = p[i]; 
    } 

    if (isalpha(stdp)) 
    { 
     if (Aa == 1) 
     { 
      c[i] = c[i] + 'A'; 
     } 
     else if (Aa == 0) 
     { 
      c[i] = c[i] + 'a'; 
     } 
    } 

    if (isalpha(stdp)) 
    { 
     if (j + 1 == kk) 
     { 
      j = (j + 1) % kk; 
      strcpy(k, argv[1]); 
     } 
     else 
     { 
      j++; 
     } 
    } 

    i++; 
} 
+3

Voici le meilleur pointeur que vous obtiendrez: utilisez un débogueur pour suivre l'exécution de votre programme. Si vous avez encore besoin d'aide, veuillez fournir un [mcve]. – kaylum

+9

'while (i

+0

Étant donné que la valeur d'un caractère dans 'p' peut affecter la fin de la boucle, il n'est pas recommandé de modifier l'un de ses caractères lorsque cela est possible. –

Répondre

0

J'ai maintenant résolu les problèmes que je faisais face au programme se terminant tôt.

La plupart des problèmes semblent avoir été résolus en arrêtant les références constantes à strlen(p) et en affectant simplement cela à une variable statique. J'ai essayé de ranger le code comme suggéré.

int main(int argc, char *argv[]) 
{ 
if (argc != 2 || argv[1] == NULL)//no more than 1 arg and not empty 
{ 
    printf("Command requires one argument to run.\n"); 
    return 1; 
} 

char *k = malloc(100); 
strcpy(k, argv[1]); 
int kInt = strlen(k); 

for (int i = 0, n = kInt; i < n ; i++)// iterating though the key to check it is alphabetic 
{ 
    if (isalpha(k[i]) == false) 
    { 
     printf("Make sure key is alphabetic!\n"); 
     return 1; 
    } 
} 

printf ("plaintext: "); 

char *p = malloc(100); 
strcpy(p, get_string()); 
int pInt = strlen(p); 

int i = 0; 
int j = 0; 
int Aa = 0; 

char *c = malloc(100); 

while (j < kInt) 
{ 
    if (islower(k[j])) 
    { 
     k[j] = k[j] - 'a'; 
    } 
    else     
    { 
     k[j] = k[j] - 'A'; 
    } 
    j++; 
} 

j = 0; 

while (i < pInt) 
{ 
    if (isalpha(p[i])) 
    { 
     if (islower(p[i])) 
     { 
      p[i] = p[i] - 'a'; 
      Aa = 0; 
     } 
     else 
     { 
      p[i] = p[i] - 'A'; 
      Aa = 1; 
     } 

     c[i] = ((p[i] + k[j]) % 26); 

     if (Aa == 1) 
     { 
      c[i] = c[i] + 'A'; 
     } 
     else if (Aa == 0) 
     { 
      c[i] = c[i] + 'a'; 
     } 

     if (j + 1 == kInt) 
     { 
      j = (j+1) % kInt; 
     } 
     else 
     { 
      j++; 
     } 
    } 
    else if (isalpha(p[i]) != true) 
    { 
     c[i] = p[i]; 
    } 

    i++; 
} 

printf("ciphertext: %s\n", c); 

free(c); 
free(k); 
free(p); 
}