Запись пробельного символа Nb в C

#c #whitespace

#c #пробел

Вопрос:

Мне просто интересно, как записать определенное количество пробельных символов в C. Например, если я хотел бы написать пробельный символ размера в файловом дескрипторе, я бы написал что-то вроде этого :

     int fd = open(filename, O_RDWR|O_CREAT, 0600);

    ....   

 char* spaces = malloc(strlen(f2));
 memset(spaces,' ', size);

 if(write(fd, sentence1, size) == -1){
   perror("Error1 while writing in the file");
   fprintf(stderr, "Error[%s, %s] : %sn", sentence1, filename, strerror(errno));
   return EXIT_FAILURE;  
 }

 ...

 if(write(fd, spaces, strlen(f2)) == -1){
  perror("Error2 while writing in file");
  fprintf(stderr, "Error[%s]:%sn", filename, strerror(errno));
  return EXIT_FAILURE;
 }

 free(spaces);

 ....    
  

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

[РЕДАКТИРОВАТЬ] Просто обновил свой код, как предложил @Gregg, но я получил эту ошибку :

  *** glibc detected *** ./io2: free(): invalid next size (fast): 0x0974b008 ***
======= Backtrace: =========
/lib/i686/cmov/libc.so.6( 0x6b281)[0xb7673281]
/lib/i686/cmov/libc.so.6( 0x6cad8)[0xb7674ad8]
/lib/i686/cmov/libc.so.6(cfree 0x6d)[0xb7677bbd]
./io2[0x80489c3]
/lib/i686/cmov/libc.so.6(__libc_start_main 0xe6)[0xb761ec76]
./io2[0x8048671]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:09 842293     /home/debianbox/posix/io/io2
08049000-0804a000 rw-p 00000000 08:09 842293     /home/debianbox/posix/io/io2
0974b000-0976c000 rw-p 00000000 00:00 0          [heap]
b74e2000-b74ff000 r-xp 00000000 08:01 12068      /lib/libgcc_s.so.1
b74ff000-b7500000 rw-p 0001c000 08:01 12068      /lib/libgcc_s.so.1
b7500000-b7521000 rw-p 00000000 00:00 0
b7521000-b7600000 ---p 00000000 00:00 0
b7607000-b7608000 rw-p 00000000 00:00 0
b7608000-b7748000 r-xp 00000000 08:01 16133      /lib/i686/cmov/libc-2.11.2.so 
b7748000-b774a000 r--p 0013f000 08:01 16133      /lib/i686/cmov/libc-2.11.2.so 
b774a000-b774b000 rw-p 00141000 08:01 16133      /lib/i686/cmov/libc-2.11.2.so 
b774b000-b774e000 rw-p 00000000 00:00 0
b775e000-b7760000 rw-p 00000000 00:00 0
b7760000-b7761000 r-xp 00000000 00:00 0          [vdso]
b7761000-b777c000 r-xp 00000000 08:01 12335      /lib/ld-2.11.2.so 
b777c000-b777d000 r--p 0001a000 08:01 12335      /lib/ld-2.11.2.so 
b777d000-b777e000 rw-p 0001b000 08:01 12335      /lib/ld-2.11.2.so 
bfe06000-bfe1b000 rw-p 00000000 00:00 0          [stack]
Abandon
  

По неизвестной причине он завершается ошибкой в свободной строке (пробелы).

[РЕДАКТИРОВАТЬ] Я, наконец, исправил свою проблему. @dmh200 предположил, что я неправильно использую переменную size и strlen(f2). Бесполезный вопрос. Спасибо за вашу помощь

Комментарии:

1. И в чем ошибка? Является ли размер чем-то иным, чем 1?

2. Строковый литерал " " представляет собой массив с 2 элементами: а именно ' ' и '' . Любая попытка прочитать больше, что эти 2 из массива неверны. Попробуйте цикл.

3. Функция записи возвращает значение -1

4. что такое ‘f2’? вы используете sizeof(f2) и size взаимозаменяемо, но f2 не отображается в вашем примере кода. если strlen (f2) короче, чем ‘size’ (или если ‘size’ не инициализирован), у вас проблема с переполнением буфера, которая, вероятно, повреждает кучу, отсюда и ваше сообщение gdb. ваш код должен сначала выполнить ‘size = strlen (f2)’.

Ответ №1:

Второй параметр write() должен указывать на буфер, который содержит (по крайней мере) количество байтов, указанное в size параметре.

Постоянная строка " " содержит только два байта — пробел и завершающий нулевой байт. Вызов write(fd, " ", size) с size > 2 ошибкой.

Если вы знаете, что всегда будете писать меньше, чем, скажем, 10 пробелов, тогда вы могли бы:

 write(fd, "          ", size);
  

Если вы не знаете, сколько пробелов вам нужно, вы можете динамически выделить буфер, заполнить его пробелами и записать это:

 char *spaces = malloc(size);
memset(spaces, ' ', size);
write(fd, spaces, size);
free(spaces);