while (scanf("%f %f %f", &a, &b, &c) != 1 || ...
float
, чтобы формат %f
scanf
работал правильно.если сначала ввести 1 2 3, то приложение выведет "Ошибка. Введите снова: "
как это исправить?
scanf
возвращает число успешно отсканированных полей, возвращаемое scanf
значение надо сравнивать с 3 в условии цикла. как это работает
%c
выводит только один. Если на одном выведенном байте остановиться -- получится фигня с вопросом. Но если вывести подряд все байты многобайтового символа -- получится этот символ.как исправить
mblen
, типа того:#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *a = "Привет, мир";
int s;
setlocale(LC_ALL, "");
for (; *a != '\0'; a+=s) {
s = mblen(a, strlen(a));
printf("%.*s-", s, a);
}
return 0;
}
setlocale
нужен для того, чтобы mblen
понял, в какой кодировке символы на входе. Локаль в момент выполнения должна быть совместимой с кодировкой исходника в момент компиляции, если это условие не выполняется, работать будет неправильно. wchar_t
:#include <locale.h>
#include <stdio.h>
#include <stddef.h>
int main() {
wchar_t *a = L"Привет, мир";
setlocale(LC_ALL, "");
for (; *a != '\0'; a++) {
printf("%lc-", *a);
}
return 0;
}
setlocale
нужен для другого: он говорит внутренностям printf
в какую локаль выполняется вывод чтобы в неё конвертировать wchar_t
. Если локаль во время выполнения не будет соответствовать кодировке исходника, код всё равно будет работать. При повторной итерации read, по идее, должен вернуть 0, так как все прочитано
read
или вернуть из неё -1 (и установить errno
, например, в EINTR
). Асинхронный сокет вернёт из read
-1 и установит errno
в EAGAIN
или EWOULDBLOCK
.Connection: Keep-Alive
или отсутствию заголовка Connection: close
в его ответе если это HTTP/1.1
. Его можно попросить закрыть соединение после ответа, послав запрос с заголовком Connection: close
или можно избежать блокировки в read
прочитав только данные ответа размер которых прислан в заголовке ответа Content-Length
. Почему вместо строки появляется мусор?
size_t xpath_formatted_size = vsnprintf(NULL, 0, xpath, arguments); char* xpath_formatted = malloc(xpath_formatted_size); vsnprintf(xpath_formatted, xpath_formatted_size, xpath, arguments);
vsnprintf(…, arguments)
меняет arguments
.Как это исправить?
char* xpath_format(const char* xpath, ...)
{
va_list arguments;
va_start(arguments, xpath);
size_t xpath_formatted_size = vsnprintf(NULL, 0, xpath, arguments) + 1;
va_end(arguments);
va_start(arguments, xpath);
char* xpath_formatted = malloc(xpath_formatted_size);
vsnprintf(xpath_formatted, xpath_formatted_size, xpath, arguments);
va_end(arguments);
return xpath_formatted;
}
d
не инициализирован, а в том, что колическтво итераций цикла вывода массива d
не зависит от того, сколько элементов было занесено в этот массив. Правильным решением было бы как-то их связать, например так:int i = 0, n;
while (piece != NULL)
{
d[i] = piece;
piece = strtok(NULL, " ");
i++;
}
n = i;
for (i = 0; i < n; i++) {
if(i%2==0)
printf("%s ",d[i]);
}
ошибка возникает на моменте сдвига элементов. Как ее исправить?
data = (Student*)realloc(data, count * sizeof(Student)); for (int i = count; i > offset; i--) { data[i] = data[i - 1]; }
count
элементов, то последний имеет индекс count - 1
. Этот цикл должен быть таким: for (int i = count - 1; i > offset; i--)
в функции main, почему то выводит мусор
%32[^,]
может записать до 33 байт (32 символа из файла + 0), что не влезет в такое поле: char title[32];
. Если файл в кодировке utf-8, то байтов в полях может быть больше чем символов. Почему-то как я не стараюсь всё записывается только в sportsmens[i].full_name,
fscanf
, а поля в твоём файле разделены пробелами, формат fscanf
должен включать в себя пробелы чтобы избавиться от разделителей. Кроме того, имеет смысл проверить, что setlocale
возвращает не-NULL, иначе он не повлияет на десятичный разделитель (и %f
не сможет прочитать число с плавающей точкой записанное как 12,12). Но не получается
zeroCounter
как я понял нужен для реализации шага "Remove leading "0" from X'", но эта реализация неправильная. К тому же она находится вне цикла while ( X != "0" )
.for (b in bits of X) // msb to lsb
говорит о том, что b должен пробегать двоичные цифры, от старшего разряда к младшему, в формуле R = 2*R + b
фигурирует значение разряда, а не его индекс, как в твоём коде.R, как я понимаю, должна быть очередная десятичная цифра получающегося числа?
Почему возникает ошибка
scanf("%d", *(b+i));
b = (int*) malloc(a * sizeof(int));
) и даже пытается её возращать, но неправильным типом и main это значение не использует. А поэтому в main b как был NULL так и остаётся. По-хорошему надо как-то так:int * input_array(int a){
int *b = (int*) malloc(a * sizeof(int));
for (int i = 0; i < a; ++i) {
printf("array[%d] = ", i);
scanf(" %d", b+i);
}
return b;
}
int main() {
...
printf("Введите длину массива:");
scanf(" %d", &a);
int *b = input_array(a);
min = find_min(b, a);
max = find_max(b,a);
average = average_function(min, max);
...
}
Если я использую printf("asd"), то весь текст в кавычках будет выведен на экран и записан в лог файл. Вот такая команда: './a.out > file.log'.
./a.out > file.log
не выведет ничего на экран, всё будет перенаправлено в файл. но 2) сам printf об этом ничего не знает. Он выводит данные в поток стандартного вывода, куда они перенаправляются потом -- не его дело. 3) оператор >
перенаправляющий вывод -- это инструкция командной оболочке как запускать программу, к самой программе отношения не имеет.Есть ли какая другая команда вывода, которая будет текст выводить только в терминал, без записи в файл?
./a.out
, без каких-либо изменений в коде. гугля, находил предложения с LD_LIBRARY_PATH=... . Но разве флаг -L при компиляции не служит той же самой цели?
-L
говорит о том, где искать любые библиотеки во время линковки приложения. LD_LIBRARY_PATH
говорит о том, где искать динамические библиотеки во время выполнения. Информация из -L
со времени линковки нигде не сохраняется. Можно зашить в слинкованный бинарник пути к библиотекам, но это делается другими опциями (см. опцию линкера -rpath
). Во время выполнения динамические библиотеки могут быть где угодно, не обязательно там, где они были во время линковки.Как создать динамическую библиотеку, которая зависит от другой библиотеки?
readelf -d libwindow.so | grep NEEDED
то там должна быть ссылка на libSDL. Твоя проблема в том, что сама libwindow.so не найдена. return x | y;
, то она не может никогда вызвать send
, а программа-сервер должна просто завершаться после расчёта НОД.recv
, но поскольку ты её не обрабатываешь, то дальше она будет пытаться выводить ответ из буфера в который не было ничего принято.не знаю, как правильно найти НОД в данном случае:
return x | y
нужно просто использовать x | y
в itoa
. Res и всё что с ним связано можно выкинуть, поскольку оно всё равно никак не используется.char *str = malloc(0);
Правильно ли я понимаю, что в str находится начало выделянно памяти на 0 байт
If the size of the space requested is zero, the behavior is implementation-
defined: either a null pointer is returned, or the behavior is as if the size were some
nonzero value, except that the returned pointer shall not be used to access an object.
а дальше идет запись символов в память, которая для нас не предназначалась?
Для процессора x86 с word 32bit. Как будут выполняться fetch?
Хочу ответ в таком формате.
почему процессор обращается 2 раза к невыравненным данным?
с чем могут возникнуть проблемы
Я пытаюсь загрузить 64-битное ядро по адресу 0x1000
AllocatePages
только возвращает адрес выделенной памяти по адресу в последнем параметре. Т.е. куда будут загружены сегменты ELF сказать нельзя и, соответственно, без динамической релокации этот ELF скорее всего работать не будет.AllocatePages
будет то же расстояние, что и между сегментами ELF, в то время как кодогенерация с флагом -fPIE
вполне может считать это расснояние неизменным. Такой ELF нужно загружать в один большой блок памяти, сохраняя расстояние между сегментами.header.e_entry
-- это прыжок в неизвестность.