Как распределить строки из считываемого файла в два разных массива?
Доброго времени суток всем))
Задачка такая: "Создать текстовый файл. Ввести последовательность символьных строк (максимально возможное количество строк – NBC), каждая из которых содержит двоичный дополнительный код положительного или отрицательного числа. Затем создать два новых массива: в первый переписать коды положительных чисел, а во второй – отрицательные. Напечатайте две таблицы, в которых указать коды чисел и их десятичные значения. Применить собственную функцию, преобразующую символьную строку, в которой записано двоичный дополнительный код числа (первый бит задает знак), в соответствующее десятичное число"
Прошу помощи с пунктом:
1)Создать два новых массива: в первый переписать коды положительных чисел, а во второй – отрицательные.
И по возможности:
2)Напечатать две таблицы, в которых указать коды чисел и их десятичные значения
Заранее благодарю за помощь
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 10
#define NBC 10
#define NSTR 2
unsigned BinToDec(unsigned Value);
char MinusBin(char* buf);
void copy(char to[], char from[]);
int main() {
system("chcp 1251");
char buf[LEN], * pmem;
char mas1[LEN], mas2[LEN];
char** strpar, ** parp;
int nstr, num, max_st = NSTR + 1;
FILE* ftxt;
if (!(ftxt = fopen("lab8.txt", "r"))) { // відкриття файла з текстом
puts("\n Файл з текстом не знайдено...\n");
return 0;
}
/* Зчитування речень з файла у динамiчну пам'ять */
nstr = 0, num = 0;
strpar = (char**)malloc(max_st * sizeof(char*)); // для масив вказівників
while (fgets(buf, LEN, ftxt) != NULL && nstr <= NBC) {
pmem = (char*)malloc(strlen(buf) + 1); // для речення в ДП
if (pmem == NULL) { // недостатньо місця
puts("Немає більше пам\'яті\n");
break;
}
strcpy(pmem, buf); // перенесення рядка в ДП
strpar[nstr++] = pmem; // запис адреси рядка в масив
if (buf[0] == '1') {
copy(mas1, pmem);
MinusBin(buf);
num = atoi(buf); //переводимо строку в число
printf(" ----------\n");
printf("| Dec: -%d |\n", BinToDec(num + 1));
printf(" ----------\n");
}
else {
copy(mas2, pmem);
num = atoi(buf); //переводимо строку в число
printf(" --------- \n");
printf("| Dec: %d |\n", BinToDec(num));
printf(" --------- \n");
}
if (nstr == max_st - 1) { // заповнено всі вказівники
max_st += NSTR; // збільшення розміру масиву
parp = (char**)realloc(strpar, max_st * sizeof(char*));
if (parp == NULL) {
puts("Немає більше пам\'яті\n");
break;
}
else
strpar = parp; // вказує на нову ділянку ДП
}
}
printf("Масив від'ємних чисел: ");
printf("%s ", mas1);
printf("\nМасив додатніх чисел: ");
printf("%s ", mas2);
strpar[nstr] = NULL; // кінець адрес – NULL
fclose(ftxt);
parp = (char**)realloc(strpar, (nstr + 1) * sizeof(char*)); // зменшуємо
if (parp != NULL) // розмір масиву вказівників, щоб він
strpar = parp; // дорівнював кількості введених рядків
puts("\n\n\tВведені коди:\n");
for (parp = strpar; *parp != NULL; parp++) {
printf(" %s", *parp);
}
printf("\n");
/* Звільнення виділеної динамiчної пам'яті */
parp = strpar;
while (*parp != NULL) { // цикл по елементах масиву вказівників
free(*parp++); // витирання рядків в ДП
}
free(strpar); // витирання масиву вказівників
strpar = NULL;
return 0;
}
void copy(char to[], char from[])
{
int i = 0;
while ((to[i] = from[i]) != '\0') i++;
}
unsigned BinToDec(unsigned Value) {
signed result = 0;
for (signed i = 1; Value; Value /= 10, i *= 2) {
result += i * (Value % 10);
}
return result;
}
char MinusBin(char* buf) {
for (int i = 0; i < strlen(buf); i++) {
if (buf[i] == '0') {
buf[i] = '1';
}
else if (buf[i] == '1') {
buf[i] = '0';
}
}
return *buf;
}