странный буфер чтения - PullRequest
0 голосов
/ 18 июля 2011

здесь я сталкиваюсь со странной проблемой, связанной с функцией чтения c в linux.

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char** argv){
    int fd=open("a.c",O_RDONLY);
    if(fd==-1){
      fprintf(stderr,"%s\n",strerror(errno));
    }
    char buf[10];
    if(read(fd,buf,9)==-1){
      fprintf(stderr,"%s\n",strerror(errno));
    }else{
      printf("%s\n",buf);
    }
}

Я думаю, что buf должен быть инициализирован в ноль, поэтому первые 9 символов читаются в буфер, а последний - '\0 'и это как строка.но результат нечетный, ниже файл AC и результат этой программы, ac

    1234567890abcd

результат

    1234567893øþzôo`

кажется, что эта строка не в буфере, я не могу понятьчто случилось, кто-нибудь может мне помочь?спасибо.

Ответы [ 4 ]

2 голосов
/ 18 июля 2011

Когда вы печатаете массив символов без окончания '\ 0', printf будет печатать все символы, пока не найдет '\ 0' в памяти.В этом случае, похоже, что '1234567893øþzôo` сопровождается' \ 0 '.Обратите внимание, что printf не знает размер массива 'buf', поэтому он будет печатать даже те символы, которые присутствуют после конца массива buf. * ​​1001 *

Как вы уже предлагали, лучше либо установить весь буфер в 0, либодобавьте '\ 0' явно в конце (как показано в коде ниже).

   buf[9] = '\0';
1 голос
/ 18 июля 2011

Вы сказали "я думаю, что buf должен быть инициализирован в ноль".Компилятор не делает это автоматически для вас, поэтому вам нужно будет сделать это самостоятельно, если вы этого хотите:

char buf[10];
memset(buf, 0, sizeof(buf));

Перед инициализацией буфера у вас нет никаких гарантий относительно того, каким будет его содержимое..

1 голос
/ 18 июля 2011

ISTM ваш буфер не заканчивается нулем, так как вы читаете только 9 символов. Измените последнюю часть вашего кода:

  if(read(fd,buf,9)==-1){
    fprintf(stderr,"%s\n",strerror(errno));
  }else{

    /* add this */ 
    buf[9] = '\0';

    printf("%s\n",buf);
  }
}

Что произойдет, если вы добавите это?

0 голосов
/ 18 июля 2011

Вы должны инициализировать buf для всех 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...