2017-07-09 1 views
1

Je voudrais convertir une chaîne en int et en appelant la fonction de main. Où le premier caractère est une lettre déclarant la base du nombre et le reste des caractères dans la chaîne sont le nombre. Je suis en mesure de faire fonctionner la fonction séparément, mais lorsque vous utilisez la fonction main pour l'appeler, elle n'imprime pas les valeurs correctes.C programme appelant une chaîne à la fonction int, je suis incapable de convertir l'entrée

Exemple d'entrée utilisateur à l'aide binaire:

b1000 
b1010 
résultat

devrait être:

b 
b 
1000 
1010 

Voici le code:

#include <stdio.h> 
#include <string.h> 
#include <math.h> 

int str_to_int(inputbase) { 
    char num1[50]; 
    num1[50] = inputbase; 

    char numcpy1[sizeof(num1) - 1]; 

    int i, len1; 
    int result1 = 0; 

    //printf("String: "); 
    //gets(num1); 

    //Access first character for base 
    printf("%c \n", num1[0]); 

    //Remove first character for number1 and number 2 
    if (strlen(num1) > 0) { 
     strcpy(numcpy1, &(num1[1])); 
    } else { 
     strcpy(numcpy1, num1); 
    } 
    len1 = strlen(numcpy1); 

    //Turn remaining string characters into an int 
    for (i = 0; i < len1; i++) { 
     result1 = result1 * 10 + (numcpy1[i] - '0'); 
    } 

    printf("%d \n", result1); 
    return result1; 
} 

int main() { 
    char *number1[50], *number2[50]; 
    int one, two; 

    printf("\nAsk numbers: \n"); 

    gets(number1); 
    gets(number2); 

    one = str_to_int(number1); 
    two = str_to_int(number2); 

    printf("\nVerifying...\n"); 
    printf("%d\n", one); 
    printf("%d\n", two); 

    return 0; 
} 
+1

Est-ce que 'int str_to_int (inputbase)' compiler sur votre machine? Quel compilateur utilisez-vous? – chux

+0

Cela ressemble beaucoup à une question de devoirs pour moi. – ndim

+0

J'utilise un compilateur gcc. La fonction int str_to_int (inputbase) ne compile pas – vibeon7

Répondre

1

Je suppose que votre code ne peut pas être compilé parce que certains les erreurs.

La première est dans la ligne

int str_to_int(inputbase) 

inputbase sont définies sans genre.

Si cela a changé pour

int str_to_int(char * inputbase) 

le point suivant d'amélioration est conforme

num1[50] = inputbase; 

assignement comme ça a un ensemble d'erreurs:

  1. num1[50] signifie que l'accès au point 51e , mais il y a seulement 50 articles indexés de 0 à 49
  2. déclaration num1[0] = inputbase; (ainsi qu'avec tout autre indice correct) est erroné en raison de la différence dans les types: num1[0] est char, mais inputbase est le pointeur
  3. num1 = inputbase; sera également faux (pour la copie chaîne = ne peut pas être utilisé en C, donc envisager de faire une boucle ou en utilisant la fonction de bibliothèque standard strncpy)

et puisque c'est que le début des problèmes, je suggère à partir de l'entrée décimale en utilisant une fonction standard pour la conversion chaîne char* à int (par exemple atoi ou sscanf), puis après avoir vérifié le programme et le trouver correct si elle est nécessaire, vous pouvez éviter d'utiliser la conversion standard et écrire votre propre str_to_int

+0

Ne préconisez pas l'utilisation de 'strncpy()', ce n'est jamais le bon outil, surtout pour les débutants. Découragez également l'utilisation de 'gets()'. – chqrlie

0

Le prototype de votre fonction str_to_int() doit spécifier le type de intputbase. Vous passez une chaîne et il n'y a aucune raison pour que str_to_int modifie cette chaîne, le type doit donc être const char *inputbase.

De plus, vous n'avez pas besoin d'une copie locale de la chaîne, juste accéder au premier caractère pour déterminer la base et analyser les chiffres en conséquence:

#include <stdlib.h> 

int str_to_int(const char *inputbase) { 
    const char *p = inputbase; 
    int base = 10; // default to decimal 

    if (*p == 'b') { // binary 
     p++; 
     base = 2; 
    } else 
    if (*p == 'o') { // octal 
     p++; 
     base = 8; 
    } else 
    if (*p == 'h') { // hexadecimal 
     p++; 
     base = 16; 
    } 
    return strtol(p, NULL, base); 
}