Portál AbcLinuxu, 3. listopadu 2025 11:47
#include <stdio.h>
char *string_hexnum(int number)
{
char mask[] = "0123456789ABCDEF";
char str[12];
int i = 10;
str[11] = '\0';
if (number < 0){
puts("ERROR: number is negative\n");
return 0;
}
if (number == 0){
str[i--] = '0';
} else {
while (number != 0){
str[i--] = mask[number % 16];
number /= 16;
}
}
str[i--] = 'x';
str[i] = '0';
return str+i;
}
void print_hexnum(int number)
{
char* pnt;
puts("test");
pnt = string_hexnum(number);
puts(pnt);
puts("test");
}
int main(void)
{
print_hexnum(888);
return 0;
}
Problemom je, ze sa to cislo nevypise, zostane prazdny riadok. Nechcem na to pouzit ziadnu funkciu z kniznice. Ked som to debuggoval, tak som videl, ze do pamete sa vsetko uklada ako ma. pnt ukazuje na prvy znak retazca - '0'.
Dakujem.
Řešení dotazu:
Chyba je v tom, ze vracite odkaz na lokalni promennou str. Bud pouzijte malloc/free, anebo zmente deklaraci char str[12] na static char str[12]. Pak to ovsem nebude fungovat v multithread programech, ale to, tusim, ani nechcete :)
return str+i;Nemůžete vracet ukazatel na lokální proměnnou - jakékoliv další volání funkce zásobník přepíše. V lepším případě to nebude fungovat, v horším případě to upadne.
Eclipse mi vyhodil warning, ze vraciam adresu lokalnej premennej, ale uspesne som to ignoroval.
Este raz dakujem.
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
unsigned long iCislo;
if (argc > 1) {
iCislo = atoi(argv[1]);
printf("Cislo %s je hexa: 0x%X\n", argv[1], iCislo);
return(0);
}
printf("Malo parametru!\n");
return(1);
}
Nevim, jestli je 2x rozumne pouzit %X na 'unsigned long'.
printf("%lx\n", atol(argv[1]));
^ ^
A return není funkce.
Já céčko moc nepoužívám, já raději Python.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.