fwrite(array, sizeof(int),array_quantity,in); ... while((num=fgetc(in))!=EOF){ // queue_push(&q,num); printf("%i ",num); }
в начале я добавляю числа 1 2 3 (пример) а из файла получаю 1000 2000 3000
В чем дело?
array_quantity
элементов размером sizeof(int)
каждый, а читаешь из файла посимвольно? IP адреса Source и Destination выводятся одинаковыми
The string is returned in a statically allocated buffer,
which subsequent calls will overwrite.
printf("src address: %s ", inet_ntoa(ip->ip_src));
printf("dest address: %s\n", inet_ntoa(ip->ip_dst));
Насколько хорошим решением является использование сигналов для выведения потоков из спящего режима, и стоит ли для этого использовать ...
Как можно реализовать, поворот динамического массива (матрица), без доп памяти?
#include <stddef.h>
#include <stdio.h>
typedef int T;
void rotate(T *p, size_t m, size_t n, size_t (*turn)(size_t m, size_t n, size_t idx))
{
size_t i, j, k;
for (i = 0; i < m * n; ++i) {
T tmp0, tmp1;
for (j = 0; j < i; ++j) {
for (k = turn(m, n, j); k != i && k != j; k = turn(m, n, k)) {
}
if (k == i)
break;
}
if (j < i)
continue;
tmp0 = p[i];
for (j = turn(m, n, i); ; j = turn(m, n, j)) {
tmp1 = p[j];
p[j] = tmp0;
tmp0 = tmp1;
if (j == i)
break;
}
}
}
void dump(size_t m, size_t n, T p[m][n])
{
size_t i, j;
for (i = 0; i < m; ++i)
for (j = 0; j < n; ++j)
printf("%d%s", p[i][j], j == n - 1 ? "\n" : ", ");
}
size_t turn_ccw(size_t m, size_t n, size_t idx)
{
return (n - 1 - idx % n) * m + (idx / n);
}
size_t turn_cw(size_t m, size_t n, size_t idx)
{
return (idx % n) * m + m - 1 - (idx / n);
}
#define M 5
#define N 7
int main()
{
size_t i, j;
T a[M][N];
for (i = 0; i < M; ++i)
for (j = 0; j < N; ++j)
a[i][j] = i * N + j;
rotate(&a[0][0], M, N, turn_ccw);
dump(N, M, (T (*)[M])&a[0][0]);
printf("\n");
rotate(&a[0][0], N, M, turn_cw);
dump(M, N, (T (*)[N])&a[0][0]);
}
turn
преобразует линейный индекс элемента из оригинального массива в индекс элемента в повёрнутом массиве.Пишу ОС (важно, не выйдет использовать stdarg)
А если вызывать такую функцию (с аргументами "test", 'q'):
void test(char* format, ...) { char* ptr = format; for (int i = -10; i < 10; i++) { putc(*(ptr+i)); } }
Ожидания были таковы, что хотя бы где-то должна была появиться буква q, чего не произошло.
void test(char* format, ...)
{
char *ptr = (char *)&format;
for (int i = -10; i < 10; i++)
{
putc(*(ptr+i));
}
}
Как работает while ( !feof ( cfPtr ) )?
FILE * cfPtr = fopen( "test.txt", "rb" );
char temp;
for (;;) {
int read = fread( &temp, sizeof( char ), 1, cfPtr );
if (read == 1) {
printf("%c\n", temp);
} else {
if (feof(cfPtr)) {
/*случился конец файла*/
} else if (ferror(cfPtr)) {
/* случилась ошибка */
}
break;
}
}
Это присваивание адреса первого байта массива {0, 0, 0, 0} указателю float?
что будет в i, после данных действий?
float* arr = (float []){0, 0, 0, 0};
int i = *((int*)arr);
проинтерпретирует память первого элемента массива как целое число и присвоит его значение i. По стандарту ieee754 нулевое значение типа float представляется в памяти как 4 нулевых байта, соответственно в i будет записан 0. как при работе с функциями из библиотеки GMP, считывать и сохранять данные в файл (и читать из файла) например используя Массивы?
как реализовать то что можно делать в командной строке:
ls > file1 > file2
ls | tee file1 file2
Единственно что мне приходит в голову...вручную записывать в каждый fd.
Первые два работают нормально, но когда доходит до 3, он не выполняется и длина выводится 0?
scanf("%d", &n);
зачитывает только один int из стандартного ввода. Если ты вводишь число и жмёшь enter, то конец строки остаётся в потоке ввода и читается gets'ом.scanf("%d ", &n);
#include <pty.h>
#include <unistd.h>
#include <thread>
#include <future>
#include <iostream>
#include <string>
ssize_t sz = 1;
int main()
{
int mfd;
pid_t pid_fork = forkpty(&mfd, NULL, NULL, NULL);
if (!pid_fork) {
// Дочерний процесс
execl("/bin/sh", "-", NULL);
} else {
// Родительский процесс
char buf[1024];
// Async
auto future = std::async(std::launch::async, [mfd]() {
std::string line;
while (sz) {
std::getline(std::cin, line);
line = line + "\n";
write(mfd, line.c_str(), line.size()); // Нужно направить в дочерний процесс как stdin
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
});
while (sz = read(mfd, buf, sizeof(buf))) {
write(STDOUT_FILENO, buf, sz); // Вывод из дочернего процесса stdout
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
exit(0);
}
}
...
#include <sys/ioctl.h>
...
struct winsize ws, *pws = NULL;
if (ioctl(1, TIOCGWINSZ, &ws) >= 0)
pws = &ws;
pid_t pid_fork = forkpty(&mfd, NULL, NULL, pws);
char * suit [4] = { "Hearts", "Diamonds", "Clubs", "Spades" };
Как изменить строку, инициализированную при объявлении массива символьных указателей, с помощью scanf?
Как добавить программу на Си в автозагрузку Windows?
И еще: как искать информацию на ответы по Си, если я пишу в гугле "Си как добавить программу в автозагрузку", но везде появляется только С++? Нереально найти ответ.
Почему результат вывода именно такой?
After a successful return from one of these system calls, the old
and new file descriptors may be used interchangeably. They refer
to the same open file description (see open(2)) and thus share file
offset and file status flags; for example, if the file offset is modified
by using lseek(2) on one of the descriptors, the offset is also
changed for the other.
printMAS (&MAS);//будет ошибкой! Почему?
&MAS
-- int (*)[5]
. Значение же адреса будет одним и тем же.Вот такие инструкции же работают...
...
и интерпретируется внутри как void *
, т.е. тип исходного адреса больше не имеет значения. Нужно ли вообще очищать память в старом указателе?