» »

Pomoc v C-ju

Pomoc v C-ju

rfmw ::

Zivjo,

prevec casa je minilo, odkar sem na faksu programiral C, zato prosim za pomoc pri tej simpl zadevi. K nizu znakov bi rad dodajal nove. Na primer:

unsigned char niz [] = "12345";
unsigned char znak='x';

----
kaksna operacija doda k nizu x, da bo potem niz enak 12345x?

Pa brez kakih knjiznicnih klicev.
Legendary 8RDA+ (reCAPed ;), XP1700+ 2108 @ 1.84 V, SLK900A AS3 @ 2500 rpm
1,5GB Samsung DDR333+Geil DDR400+SuperTalent DDR400 @ DC 200 MHz @ 6-3-3-2.5
  • spremenil: Primoz ()

schtr4jh ::

includaš string.h in uporabiš strcat(niz1,niz2) ... v niz1 doda niz2 ... v tvojem primeru pa ne moreš dodat k spremenljivki x, ker imaš prostor sam za en znak.

rfmw ::

Hvala za pomoc. A s pointerji (*) in naslovnimi operatorji (&) pa ne bi slo? Je res potrebno uporabiti stryxw komando?

To programiram na embedded sistemu, kjer sem precej omejen s knjiznicnimi klici ;)
Legendary 8RDA+ (reCAPed ;), XP1700+ 2108 @ 1.84 V, SLK900A AS3 @ 2500 rpm
1,5GB Samsung DDR333+Geil DDR400+SuperTalent DDR400 @ DC 200 MHz @ 6-3-3-2.5

Zgodovina sprememb…

  • spremenil: rfmw ()

TEDY ::

tisto s strcat() bi delalo, če niz[] nima dovolja placa?

je že kr nekaj časa minilo odkar sem kej programiru drugače pa tako nekako:

int i=0;
while(*niz++) i++;
(char *)(&niz+i) = znak; //to nism ziher
(char *)(&niz+i+1) = 0;

nisem ziher če je pravilno, probaj....

Zgodovina sprememb…

  • spremenil: TEDY ()

fiction ::

Tele funkcije za delo z nizi so nekaj precej obicajnega. Ampak za vsak primer, ce jih nimas, tukaj na hitro ena bolj lame implementacija (upam, da bo delalo):

char *mystrcpy(char *dst, const char *src)
{
  char *dst0 = dst;
  while ((*dst++ = *src++));
  return dst0;
}

unsigned mystrlen(const char *str)
{
  char *s = (char*) str;
  while (*s++);
  return (s - str - 1);
}

char *mystrcat(char *dst, const char *src)
{
  mystrcpy(dst + mystrlen(dst), src);
}

Drugace strcat() ne mores uporabljati, ker je drugi parameter pointer na nek kos pomnilnika, kjer se nahajajo znaki in je na koncu '\0'. Oz. bolj po domace: parameter je niz znakov in en sam znak ('x') to ni. Kvecjemu bi lahko naredil &znak, samo se zmeraj imas problem, ker ni ASCII 0 naprej od tega znaka. Ce hoces strcat(niz, znak) bi moral imeti: unsigned char znak[] = "x". V tvojem primeru pa lahko naredis nekaj ala:

unsigned len = strlen(niz);
niz[len] = znak;
niz[len + 1] = '\0';

TEDY: Tudi tvoja koda ni nic boljsa kar se tega tice. Prevajalnik bo vedno rezerviral samo toliko kot je dolg niz (+ 1 za ASCII 0), ne glede na to ali reces char *niz = "foo" ali pa char niz[] = "foo".

Samo ti moras vedno napisati ta znak 0 na koncu sicer "bo niz" se vse tisto naprej do prve nule - se pravi nimas enega dodatnega znaka fore kot je nekdo omenil.

Vedno pa lahko reces npr. char niz [128] = "12345"; pa bo dovolj prostora. Ali pa si dinamcino alociras prostor v casu izvajanja (vendar je najbrz bolje imeti neko fiksno omejitev). Seveda pa moras paziti na to, da ne napises prevec, ker bi sicer lahko prislo do buffer overflowa, kar je lahko ce uporabnik nadzira tisto kar se pise precej kriticna varnostna ranljivost. Je pa drugace zelo verjetno, da bo program delal, ceprav bos pisal ze po necem drugem v pomnilniku (torej v vseh omenjenih primerih, kjer se nekaj doda v niz, ceprav ta nima vec "prostora").

rfmw ::

Hvala vsem za pomoc, bom preskusil vase predloge :)
Legendary 8RDA+ (reCAPed ;), XP1700+ 2108 @ 1.84 V, SLK900A AS3 @ 2500 rpm
1,5GB Samsung DDR333+Geil DDR400+SuperTalent DDR400 @ DC 200 MHz @ 6-3-3-2.5


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Niti - segmentation fault

Oddelek: Programiranje
211994 (841) galu
»

[C] problem s kazalci

Oddelek: Programiranje
141342 (1103) BigWhale
»

[C] Narascajoce sortiranje linearnega seznama

Oddelek: Programiranje
71863 (1752) Jebiveter
»

[NALOGA][C] fri-vsp - strukture (struct)

Oddelek: Programiranje
101559 (1400) Vesoljc
»

strcpy reče segmatation fault

Oddelek: Programiranje
101504 (1455) MasterMind

Več podobnih tem