Warum funktioniert dieser code nicht [C]

OP #6368767
Lesenswert?
• ▲
▼
Guten Abend,
ich bin in C leider totaler Anfänger und wollte daher fragen ob 
eventuell einer der erfahrerern Benutzer mir bei meinem Code das Problem 
erklären kann, was sehr nett wäre :)
1
#include <stdio.h>
2
#include <string.h>
3
#include <stdlib.h>
4

5
int *splitToDigits(int inputvalue)
6
{
7
    char buffer[64];
8
    int size, i, *outpointer;
9

10
    size = (int) sprintf(buffer, "%d", inputvalue);
11
    outpointer = (int *) malloc((size + 1) * sizeof(int));
12

13
    for (i=0;i<size;i++)
14
        outpointer[i] = atoi(buffer[i]);
15

16
    return outpointer;
17
}
18

19
int main()
20
{
21
    int testvalue  = 8392, *pointer , size = 4, i;
22

23
    pointer = splitToDigits(testvalue);
24

25
    for (i=0;i<size;i++)
26
        printf("%d", pointer[i]);
27
}
Folgene Fehlermeldungen entstehen
1
[test1.c 2020-08-11 19:12:35.303]
2
,,test1.c: In Funktion »splitToDigits«:
3
test1.c:14:36: Warnung: Übergabe des Arguments 1 von »atoi« wandelt eine Zahl in einen Zeiger um, ohne explizite Typkonvertierung [-Wint-conversion]
4
   14 |         outpointer[i] = atoi(buffer[i]);
5
      |                              ~~~~~~^~~
6
      |                                    |
7
      |                                    char
8
In Datei, eingebunden von test1.c:3:
9
/usr/include/stdlib.h:104:30: Anmerkung: »const char *« erwartet, aber Argument hat Typ »char«
10
  104 | extern int atoi (const char *__nptr)
11
      |                  ~~~~~~~~~~~~^~~~~~

Vielen Dank im vorraus, und schönen Abend noch :)
#6368783
Lesenswert?
• ▲
▼
Na, im Prinzip steht es doch schon da: atoi will einen Pointer auf einen 
char und keinen char. Also brauchst du nicht den Inhalt von buffer[i], 
sondern die Adresse von buffer[i]:

1
atoi(&(buffer[i]));

Ob das so schon das tut was du willst, weiß ich nicht. Ich habe mir 
jetzt nur die eine Stelle angeschaut.
OP #6368788
Lesenswert?
• ▲
▼
Danke für die schnelle Antwort, ne tut nich das was ich will. Habe grade 
eine andere Lösung gefunden.

Statt
1
outpointer[i] = atoi(&buffer[i]);
Benutze ich jetzt:
1
outpointer[i] = (int) buffer[i] - 48;

Hätte ich Idiot einfach mal 5 Minuten länger überlegt bevor ich meine 
fragen ins Internet stelle :/
Gast #6368794
Lesenswert?
• ▲
▼
Da M. schrieb:
> outpointer = (int *) malloc((size + 1) * sizeof(int));

das +1 brauchst du nicht. Üblicherweise macht man so eine Zerlegung 
übrigens über Ganzzahldivision und Modulo-Operator. Die Rückgabe des 
Pointers ist auch keine gute Lösung, weil du außerhalb der Funktion 
nicht weißt, wie viele Elemente das erzeugte Array hat. Üblicherweise 
würde man als Rückgabewert die Anzahl der Stellen haben und das Array 
über einen doppelten Pointer als Parameter zurückgeben.
#6368891
Lesenswert?
• ▲
▼
Noch ein Tipp: Solltest Du auf den Zwischenspeicher verzichten wollen, 
so ist auch eine rekursive Variante möglich:
1
#include <stdio.h>
2
#include <stdlib.h>
3

4
int splitToDigits(int **outpointer, int inputvalue, int size)
5
{
6
        int total, next = inputvalue / 10, newsize = size + 1;
7
        if ( next )
8
                total = splitToDigits(outpointer, next, newsize);
9
        else
10
                *outpointer = (int*) malloc((total = newsize) * sizeof(int));
11
        (*outpointer)[total-newsize] = inputvalue - next * 10;
12
        return total;
13
}
14

15
int main()
16
{
17
        int testvalue = 8392, *pointer, size = splitToDigits(&pointer, testvalue, 0), i;
18

19
        for ( i=0; i < size; ++i)
20
                printf("%d\n", pointer[i]);
21
}

Als Zwischenspeicher dient hier quasi der Stack. Ist allerdings mit 
einem gewissen Laufzeit-Overhead verbunden, also nicht unbedingt etwas 
für High-Performance Anwendungen. :-)

PS: Eigentlich sollte man an allen Stellen statt int besser *unsigned 
int* verwenden.
Gast #6369192
Lesenswert?
• ▲
▼
Ich hab mir zum Spass mal eine overengineerte Lösung ausgedacht, in C, 
aber lose Inspiriert von JS Generator Funktionen.

Erschaudert in Anbetracht meiner C Macromagie, Muhahahaha!
Angehängte Dateien:

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.