Avatar billede lincoln Nybegynder
30. august 2002 - 18:29 Der er 11 kommentarer og
2 løsninger

Konverting af int til char

Jeg har et tal gemt i en integer, der skal udskrives i et GtkEntry og derfor (går jeg ud fra) skal konverteres til en char*. Hvordan gør jeg det?


Jeg har lavet noget jeg tror er en char-til-int-funktion:

  void CharToInt(gchar* c[])
  {
      gint i;

      gchar str[] = "10";
      i = atoi(str);

      return i;
  }

-- vil den gøre som forventet?

--
100 point gives væk, hvis jeg får et brugbart svar på begge spørgsmål inden 19:30
Avatar billede medions Nybegynder
30. august 2002 - 18:40 #1
Du vil hvad siger du? En char-to-int funktion ser sådan her ud:

int a;
char b;
b = '3';
a = (int)b;

//>Rune
Avatar billede medions Nybegynder
30. august 2002 - 18:41 #2
Eller vil du konvertere en tekst-streng (Array af char's) til en tal?

int char_to_int (const char string[]) {
    return atoi(string);
}

eller

int char_to_int (const char *string) {
    return atoi(string);
}

Eller hvad?

//>Rune
Avatar billede mbulow Nybegynder
30. august 2002 - 18:45 #3
Jeg har ikke afprøvet dem her, det er bare en løsning jeg sådan lige har lavet i tankerne, så du må selv lige teste dem.
Bemærk... Jeg ved ikke om du bruger C eller C++, så jeg har lavet det med C++'s new-operator, som du lige må ændre til en malloc hvis du bruger C.
Desuden... Husk nu lige at du selv er nødt til at deallokere det char-array som bliver allokeret i IntToChar

int CharToInt(char *c){
  return atoi(c);
}

char *IntToChar(int i){
  char tmp[33];
  char *result;

  itoa(i, tmp, 10);
  result = new char[strlen(tmp)+1];
  strcpy(result, tmp);

  return result;
}
Avatar billede medions Nybegynder
30. august 2002 - 18:47 #4
Og så er der den "grimme", men måske sikre måde:

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

bool char_to_int (const char string[], int *pres) {
    if (pres == NULL || string == NULL)
        return false;
    else if (string[0] == 0)
        return false;
    else {
        if (sscanf(string, "%i", pres) != 1)
            return false;
        else
            return true;
    }       
}

void main () {
    char buffer[1024];
    int res;
    if (gets(buffer) == NULL || !char_to_int(buffer, &res))
        puts("You must enter a number");
    else
        printf("You entered %i\n", res);
}

//>Rune
Avatar billede mbulow Nybegynder
30. august 2002 - 18:58 #5
Hvis du bruger C i stedet for C++ tror jeg bare du skal skifte den linje med new-operatoren ud med:

result = (char*)malloc(strlen(tmp)+1);

Jeg er ikke 100% sikker med prøv hvis det er...
Avatar billede lincoln Nybegynder
30. august 2002 - 19:22 #6
1)  Warning: No previous prototype for IntToChar

2a)  Implicit declaration of itoa
2b)  Undefined reference to itoa

Hvordan fjerner jeg fejlen og advarslen?

Jeg har indlæst <stdio.h> og <string.h> udover de libs Glade har smidt ind.

Jeg bruger the GNU C Compiler på et linux-system.

Undskyld for min newbieness.
Avatar billede lincoln Nybegynder
30. august 2002 - 19:38 #7
Jeg har fået erstattet itoa med sprintf. itoa er ikke ANSI C.

Erstatningskode:
tmp_int = sprintf(tmp, "%d", i);
Avatar billede mbulow Nybegynder
30. august 2002 - 19:42 #8
itoa ikke ANSI C... Overrasket... Er den ikke... UPS :) Sorry

--- Resten er skrevet før jeg læste din sidste kommentar, men gad ikke slette ---

Hmm... Hvis ikke fejl 2(a og b) er et resultat af fejl 1, skal du lige kontrollere om du har husket at #include <stdlib.h>



Angående 1'eren:
Det lyder lidt som om du kalder funktionen IntToChar på et tidspunkt hvor den endnu ikke er blevet defineret f.eks. sådan her:

void main(){
  EnEllerAndenFunktion();
}

void EnEllerAndenFunktion(void){
  //Noget kode...
}



Den er bare ikke helt gangbar, du skal sørge for at "nævne" funktionen inden den bliver brugt, på en af de her to måder f.eks. sådan her:

void EnEllerAndenFunktion(void){
  //Noget kode
}

void main(){
  EnEllerAndenFunktion();
}

Men fordi det ikke altid er muligt bare at flytte rundt på funktionerne, kan du starte med funktionens prototype sådan her:

void EnEllerAndenFunktion(void);  // <--- Prototypen

void main(){
  EnEllerAndenFunktion();  // Her ved compileren at funktionen findes
                            // længere nede i koden, og stoler på dig
}

void EnEllerAndenFunktion(void){
  //Noget kode
}
Avatar billede mbulow Nybegynder
30. august 2002 - 19:48 #9
Eller på den anden side set... 1'eren er jo kun en warning, så det er ikke engang sikkert det er derfor, for jeg skulle da mene det burde give en fejl (ikke en warning)
Avatar billede lincoln Nybegynder
30. august 2002 - 20:43 #10
Det er ikke derfor, da jeg har min funktion og står helt oppe i toppen og først kalder den nede til sidst... Men mit program virker og da det kun er øvelse er det ikke så vigtigt. Det kan være jeg ser fejlen når jeg ser på programmet igen.

Men tusind tak for hjælpen!
Avatar billede lincoln Nybegynder
30. august 2002 - 20:45 #11
... fejlen - det var jo kun en advarsel. Det går selvfølgelig ikke i vigtige programmer, men her går det nok...
Avatar billede mbulow Nybegynder
30. august 2002 - 21:08 #12
Jeg har faktisk ikke så meget styr på ANSI C (Er også mest til C++), men jeg lavede da alligevel lidt søgninger på nettet, for at finde ud af hvad advarslen går ud på, og jeg har da fået en lille mistanke, der kunne være værd at undersøge.

Prøv engang at give funktionen en prototype alligevel, tror det er noget med at ANSI C helst vil have både prototype og definition, vist nok noget dobbeltsikkerhed, men jeg er ikke helt sikker, men prøv at læse det her news indlæg:

http://groups.google.com/groups?q=%2B%22ANSI+C+function+prototype%22&hl=da&lr=&ie=UTF-8&oe=UTF-8&selm=34234FAC.310F%40ici.net&rnum=2
Avatar billede medions Nybegynder
31. august 2002 - 03:16 #13
Anytime...
Thx 4 Poinz

//>Rune
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester