ignoring \0 within char

06/05/2011 - 08:38 von sebastian | Report spam
Hello,

i try to read out information from a file. there will be sometime
within the read information a charendterminator. is there a possibilty
to ignore this and step to the next character?

gcc options

Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro
4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/
README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/
usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-
linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-
included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/
include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --
enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --
disable-
werror --with-arch-32=i686 --with-tune=generic --enable-
checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --
target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

input line

T^@e^@s^@t

code example

long lReadBytes = 0;
size_t t = 100;
char *buffer = (char *) malloc(sizeof(char*));
buffer = NULL;

while ( (lReadBytes = getline( &buffer, &t, pdfstream)) > 0 )
{
int pos = 0;
for (pos = 0; pos <= lReadBytes; pos++)
{
printf("%c", buffer[pos]);
}
}


thanks.
 

Lesen sie die antworten

#1 Rainer Weikusat
06/05/2011 - 16:21 | Warnen spam
sebastian writes:
i try to read out information from a file. there will be sometime
within the read information a charendterminator. is there a possibilty
to ignore this and step to the next character?



[...]

input line

T^@e^@s^@t

code example

long lReadBytes = 0;
size_t t = 100;
char *buffer = (char *) malloc(sizeof(char*));



malloc gibt einen void * zurueck und in C ist der zuweisungskompatibel
zu allen anderen Objektzeigern es gibt also keinen Grund, ihn zu
casten. Ferner ist 'sizeof(char *)' Quatsch (bzw eine komplizierte Art
und Weise, die Zahl 8 zu schreiben).

buffer = NULL;



An dieser Stelle wird der Zeiger auf den angeforderten Bereich
ueberschrieben, Ergebnis davon ist ein Speicherleck.

while ( (lReadBytes = getline( &buffer, &t, pdfstream)) > 0 )
{
int pos = 0;
for (pos = 0; pos <= lReadBytes; pos++)
{
printf("%c", buffer[pos]);
}



Wenn man mal grosszuegig davon ausgeht, dass Fehler nicht stattfinden:

#include <stdio.h>

int main(void)
{
char *lp;
size_t nr, x;
unsigned c;

lp = NULL;
nr = getline(&lp, &x, stdin);
x = 0;
while (x < nr) if ((c = lp[x++])) printf("%c", c);

return 0;
}

Ggf waere es sinnvoller, isprint(3) anstelle des Tests auf != 0 zu
benutzen.

Ähnliche fragen