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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren