Witam.
Program ma dzielić ciąg znaków wprowadzany z klawiatury na części, co 50 znaków. W każdej części mają być usunięte białe znaki na końcu. Oto kod, który napisałem:
#include <stdio.h>
#define MAXCHARS 2000 /* maksymalna liczba znaków w danych wejściowych */
#define STEP 50 /* co ile znaków są różne części */
int wczytaj(char s[]); /* wczytaj: wczytuje ciąg znaków do 's' */
void add(char to[], char from[]); /* add: dodaje do ciągu znaków 'to' ciąg 'from' */
void podziel(char s[]); /* podziel: dzieli tekst na częsci, co 'STEP' znaków */
void zeruj(char s[]); /* zeruj: wypełnia ciąg znaków 's' zerami - EOF */
void copy(char to[], char from[]); /* copy: kopiuje ciąg znaków 'from' do ciągu znaków 'to' */
main()
{
char ciag[MAXCHARS]; /* ciąg znaków wczytywany z klawiatury */
wczytaj(ciag);
podziel(ciag);
printf("%s", ciag);
return 0;
}
int wczytaj(char s[])
{
int c;
int i;
for (i = 0; (c = getchar()) != EOF && i < MAXCHARS; ++i)
s[i] = c;
}
void add(char to[], char from[])
{
int i;
int j;
char tekst[] = "\n\n---------- NOWA CZĘŚĆ ----------\n\n";
int len;
len = sizeof(tekst) / sizeof(char);
i = MAXCHARS - 1;
while (i >= 0 && to[i] == EOF)
--i;
++i;
for (j = 0; (i + j) < MAXCHARS; ++j) {
if (from[j] == EOF)
break;
to[i+j] = from[j];
}
i = j;
for (j = 0; (i + j) < MAXCHARS && j < len; ++j)
to[i+j] = tekst[j];
}
void podziel(char s[])
{
int i;
int j;
char czesc[STEP];
char ciag[MAXCHARS];
for (i = 0; i < MAXCHARS; i += STEP) {
for (j = 0; j < STEP; ++j)
czesc[j] = s[i+j];
j = MAXCHARS - 1;
while (j >= 0 && (czesc[j] == ' ' || czesc[j] == '\t' || czesc[j] == '\n'))
--j;
++j;
for (j = 0; j < MAXCHARS; ++j)
czesc[j] = EOF;
add(ciag, czesc);
zeruj(czesc);
}
copy(s, ciag);
}
void zeruj(char s[])
{
int i;
int len; /* długość ciągu 's' */
len = sizeof(s) / sizeof(char);
for (i = 0; i < len; ++i)
s[i] = EOF;
}
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != EOF)
++i;
}
Po uruchomieniu, wprowadzeniu tekstu i znaku EOF program zostaje przerwany i w konsoli jest ten tekst:
*** stack smashing detected ***: ./dziel terminated
Naruszenie ochrony pamięci
System: Linux
Kompilator: GCC 4.6.1
Z góry dziękuję za pomoc w znalezieniu błędu.