Такая ситуация. Есть серверный сокет на си. К нему конектится сокет на java и посылает строку
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sok.getOutputStream())), true);
String comand_line = "echo Test command line";
//посылаем команду...
out.write(comand_line);
out.flush();
Серверный сокет получает строку, печатает ее и записывает в файл
if((batfile = fopen(batfilename, "w+")) == NULL)
{
printf("Cant't create bat file %s\n", batfilename);
fprintf(logfile, "Cant't create bat file %s\n", batfilename);
exit(1);
}
//Here code for writing bat file. Need to choose separator between cmd commands.
//============ Begin ========
iResult = recv(writefd, recvbuf, recvbuflen, 0);
char *bat_file = (char*)malloc((iResult)*sizeof(char));
memcpy(bat_file, recvbuf, iResult);
printf("Number of byte = %d Command = %s\n", iResult, bat_file);
free(bat_file);
fclose(batfile);
Но печатается какая то хрень в конце: Number of byte = 23 Command = echo Test command line
Ён║лллллллл
И в файл записывается почему то 40 байт:
echo Test command line
²²²²║
≡¡║½½½½½½½½
Кто-нибудь встречался с таким...
Здравствуйте, Аноним, Вы писали:
А>А>if((batfile = fopen(batfilename, "w+")) == NULL)
А>{
А> printf("Cant't create bat file %s\n", batfilename);
А> fprintf(logfile, "Cant't create bat file %s\n", batfilename);
А> exit(1);
А>}
А>//Here code for writing bat file. Need to choose separator between cmd commands.
А>//============ Begin ========
А>iResult = recv(writefd, recvbuf, recvbuflen, 0);
А>char *bat_file = (char*)malloc((iResult + 1)*sizeof(char));
А>memcpy(bat_file, recvbuf, iResult);
А>bat_file[iResult] = 0;
А>printf("Number of byte = %d Command = %s\n", iResult, bat_file);
А>free(bat_file);
А>fclose(batfile);
А>
Здравствуйте, remark, Вы писали:
R>Здравствуйте, Аноним, Вы писали:
А>>А>>if((batfile = fopen(batfilename, "w+")) == NULL)
А>>{
А>> printf("Cant't create bat file %s\n", batfilename);
А>> fprintf(logfile, "Cant't create bat file %s\n", batfilename);
А>> exit(1);
А>>}
А>>//Here code for writing bat file. Need to choose separator between cmd commands.
А>>//============ Begin ========
А>>iResult = recv(writefd, recvbuf, recvbuflen, 0);
А>>char *bat_file = (char*)malloc((iResult + 1)*sizeof(char));
А>>memcpy(bat_file, recvbuf, iResult);
А>>bat_file[iResult] = 0;
А>>printf("Number of byte = %d Command = %s\n", iResult, bat_file);
А>>free(bat_file);
А>>fclose(batfile);
А>>
R>
CПС!!!
Чтобы понять для себя...
Резервируем +1 байт для символа окочания строки
только почему
bat_file[iResult] = 0;
а не
bat_file[iResult] = '\0';
и еще я пытался вот так делать...
strcat(bat_file, "\0");
не получилось
и вот так
strcat(bat_file, '\0');
аксесс виолейшен...
Я подозревал что что-то не то с концом строки...
Здравствуйте, Аноним, Вы писали:
А>CПС!!!
А>Чтобы понять для себя...
А>Резервируем +1 байт для символа окочания строки
Да
А>только почему
А>bat_file[iResult] = 0;
А>а не
А>bat_file[iResult] = '\0';
В данном случае это одно и тоже. 0 неявно приводится к '\0'.
А>и еще я пытался вот так делать...
А>strcat(bat_file, "\0");
А>не получилось
А>и вот так
А>strcat(bat_file, '\0');
А>аксесс виолейшен...
А>Я подозревал что что-то не то с концом строки...
Это можно делать только тогда, когда у строки *уже* есть конец строки. А пока его это — некорректная строка. И соотв. функции работы со строками не работают. Поэтому тут надо вручную добавить конец строки.
Здравствуйте, remark, Вы писали:
Уточнение.
А>>и еще я пытался вот так делать...
А>>strcat(bat_file, "\0");
А>>не получилось
Потому что strcat дописывает в конец строки bat_file (там, где находится маркер NUL = '\0') — а его ещё нет. Точнее, он есть где-то за пределами осмысленного текста, и скорее всего, относится к совершенно другим данным. Попытка записи туда приведёт к сюрпризам.
А>>и вот так
А>>strcat(bat_file, '\0');
А>>аксесс виолейшен...
А здесь всё гораздо жёстче: литерал '\0' == литерал 0 == универсальный ноль --> указатель (const char*)NULL,
вот и получили чтение по нулевому адресу.
... << RSDN@Home 1.2.0 alpha rev. 655>>