2015-07-27 1 views
0

Le programme suivant refuse de compiler en raison de ces erreurs:« entier Incompatible à la conversion de pointeur »

vigenere.c:52:31: error: incompatible integer to pointer conversion assigning to 
    'string' (aka 'char *') from 'int' [-Werror,-Wint-conversion] 
    ...ciphertext[i] = ((((plaintext[i] - 65) + keyword[num % keylength]) % 26) + 65); 
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
vigenere.c:56:31: error: incompatible integer to pointer conversion assigning to 
    'string' (aka 'char *') from 'int' [-Werror,-Wint-conversion] 
    ...ciphertext[i] = ((((plaintext[i] - 97) + keyword[num % keylength]) % 26) + 97); 
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

Et voici le programme, qui vise à mettre en œuvre simple chiffrement de Vigenère:

#include <stdio.h> 
#include <cs50.h> 
#include <string.h> 
#include <ctype.h> 

int main(int argc, string argv[]) 
{ 
    if(argc != 2) 
    { 
     printf("Invalid input; try again!\n"); 
     return 1; 
    } 
    else if(argv[1]) 
    { 
     for(int i = 0, n = strlen(argv[1]); i < n; i++) 
     { 
      if(!isalpha(argv[1][i])) 
      { 
       printf("Invalid input; try again!\n"); 
       return 1; 
      } 
     } 
    } 

    // get plaintext from user 
    string plaintext = GetString(); 
    string ciphertext[100]; 
    int num = 0; 

    string keyword = argv[1]; 
    int keylength = strlen(keyword); 

    // change key values from letters to shifts 
    for(int i = 0, n = keylength; i < n; i++) 
    { 
     if(isupper(keyword[i])) 
     { 
      keyword[i] = keyword[i] - 65; 
     } 
     else if(islower(keyword[i])) 
     { 
      keyword[i] = keyword[i] - 97; 
     } 
    } 

    for(int i = 0, n = strlen(plaintext); i < n; i++) 
    { 
     if(isalpha(plaintext[i])) 
     { 
      if(isupper(plaintext[i])) 
      { 
       ciphertext[i] = ((((plaintext[i] - 65) + keyword[num % keylength]) % 26) + 65); 
      } 
      else if(islower(plaintext[i])) 
      { 
       ciphertext[i] = ((((plaintext[i] - 97) + keyword[num % keylength]) % 26) + 97); 
      } 
      num++; 
     } 
     // non-alphabetic characters 
     else 
     { 
      ciphertext[i] = plaintext[i]; 
     } 
     printf("%c", ciphertext[i]); 
    } 
    printf("\n"); 
} 

Je ne sais pas pourquoi le compilateur lance l'erreur, parce que j'ai une ancienne version du programme, compilée il y a quelques mois (le code est exactement le même sur les lignes 52 et 56) qui fonctionne très bien.

Je vais vraiment apprécier toute aide :)

+2

Quel type de type est 'string'? Vous déclarez un tableau de 'string' pour votre variable' ciphertext'. Je dirais vérifier les types de votre "ancienne" version. –

+0

Si c'est un typedef personnalisé, vous venez de vous faire mordre. ;-) 'ciphertext' est un tableau de' char * ', I.e. array of * multiple * strings, et vous essayez d'assigner des caractères simples ('int') à ses éléments (' char * '), dont le compilateur (légitimement) se plaint. Je pense que c'est un très mauvais typedef, BTW ... – DevSolar

+1

"* J'ai une ancienne version du programme, compilée il y a quelques mois (le code est exactement le même sur les lignes 52 et 56) qui fonctionne très bien. *" Comment cette ancienne version du code a-t-elle défini 'cyphertext'? – alk

Répondre

4

variable ciphertext est un tableau de char*, je pense qu'il devrait être:

char ciphertext[1000] 
1

ciphertext est un tableau de type string (avec string étant un typedef'd char *).

Donc, ce

ciphertext[i] 

évalue une char *.

((((plaintext[i] - 65) + keyword[num % keylength]) % 26) + 65) 

est évalué à int. Le code tente d'affecter un int à char *. Cela n'a pas de sens (ici).

0

S'il vous plaît noter que la déclaration suivante conduit à une valeur int:

((((plaintext[i] - 65) + keyword[num % keylength]) % 26) 

Du côté de la réception, il est un string ou char*. Ainsi, l'erreur.

-1

Je vois que vous faites CS50! J'espère que cela vous réjouit de savoir que j'ai rencontré le même problème. Je l'ai résolu en faisant du texte chiffré un tableau d'entiers et typecasting (char) quand il s'agissait d'imprimer le chiffrement au terminal.

Le point d'apprentissage plus large ici est la manière dont les éléments de chaîne sont stockés en C. Les autres personnes y répondent succinctement.

+0

Vous pouvez ajouter un commentaire ..Au-dessus n'est pas une réponse –

+0

S'il vous plaît voir [ce guide] (https://stackoverflow.com/help/how-to-answer) lorsque vous répondez aux questions – marcman

+0

@HariomSingh mon poste n'est pas une réponse directe à sa question, mais comme le guide ci-dessus dit, vous pouvez fournir une solution connexe, ce que j'ai fait. – Aidan