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(intinputvalue)
6
{
7
charbuffer[64];
8
intsize,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
returnoutpointer;
17
}
18
19
intmain()
20
{
21
inttestvalue=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«
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.
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.
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.
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!