Forum: PC-Programmierung Warum funktioniert dieser code nicht [C]


von Da M. (da_m)


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 :)

von P. S. (namnyef)


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.

: Bearbeitet durch User
von Da M. (da_m)


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 :/

von Jim (Gast)


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.

von Da M. (da_m)


Lesenswert?

Danke für die Tipps :)

von A. H. (ah8)


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.

: Bearbeitet durch User
von zu lang (Gast)


Lesenswert?

Da M. schrieb:
> size = (int) sprintf(buffer, "%d", inputvalue);

geht bei negativen Zahlen schief.

von ? DPA ? (Gast)


Angehängte Dateien:

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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.