Я хочу подойти к строке как к массиву, обрезать ее до определенной длины и сохранить в двумерном массиве. Например, у меня есть 20 строк текстового файла. как этот "input.txt"
www.google.com
www.naver.com
kbphonemall.com
kbplant.com
k-bplus.com
kbpointreestore.com
kbprint.com
kbprism.com
kbprivatebanking.com
kbpstore.com
kbr9rtudaf5ppy.com
kbrafting.com
kbraille.com
kbrainbank.com
kbrainbow.com
kbrainc.com
kbrainglocal.com
kbrandexpo.com
kbrandingschool.com
kbrandmall.com
а затем я прочитал этот файл и попытался обрезать его в каждой строке, используя «\ n в качестве ключа. Например, если вы хотите вырезать четыре линии одновременно, вы должны сначала вырезать их до «kbplant.com». И усеченная строка выглядит так.
www.google.com\nwww.naver.com\nkbphonemall.com\nkbplant.com\n
и затем он будет сохранен в массиве указателей. как это
char *cutting[n];
cutting[0] = "www.google.com\nwww.naver.com\nkbphonemall.com\nkbplant.com\n"
cutting[1] = "k-bplus.com\nkbpointreestore.com\nkbprint.com\nkbprism.com\n"
.... more
Пока что это объяснение функций, которые я хочу реализовать, и я покажу вам код.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define IPATH "input.txt"
int main(int argc, char *argv[]) {
char *ListBuffer;
int ListSize;
FILE *InputFile = fopen(IPATH, "r");
fseek(InputFile, 0, SEEK_END);
ListSize = ftell(InputFile);
ListBuffer = malloc(ListSize);
memset(ListBuffer, 0, ListSize);
fseek(InputFile, 0, SEEK_SET);
fread(ListBuffer, ListSize, 1, InputFile);
int count = 0;
ListBuffer[ListSize] = '\0'; //add NULL word
for (int i = 0; i <= ListSize; i++) {
if (ListBuffer[i] == '\n') {
count++;
if (count == 4) {
printf("c%d\n", i);
count = 0;
}
}
if (ListBuffer[i] == 0) {
printf("c%d\n", i);
count = 0;
}
}
fclose(InputFile);
free(ListBuffer);
ListBuffer = NULL;
}
это мой код. Я использовал различные функции, такие как функция strcpy, функция strtok, функция memcpy и т. д., но реализовать нужную функцию было сложно. Есть ли лучший способ или алгоритм?
Если вам нужно больше объяснений, я отвечу на него быстро.
Я был бы признателен, если бы вы могли ответить. Хорошего дня.
Wonlf, струны обозначают свою длину с заканчивающимся нулевой символ. Это необычно, но возможно для читать нулевого символа. При сохранении строки ввода в виде строки (которая добавляет '\0') возникает проблема невозможности отличить прочитанное '\0' от добавленного. Возможно, обнаружьте этот случай и обработайте его как ошибку или используйте нестроковое решение.
Wonlf ListBuffer[i] != 0 не будет ложным, если не будет прочитан нулевой символ. Код будет повторяться после ListSize. Лучше как for (int i = 0; i < ListSize; i++) {.
Wonlf, Если в последнем линия файла отсутствует конечная '\n', например "kbrandmall.com" вместо "kbrandmall.com\n", что должен делать код? Обнаружить и исключить? Относитесь к этому так, как если бы оно заканчивалось на '\n'?
@Wonlf не добавляйте код в комментарии, так как вы видите, что он нечитаем. Вместо редактировать ваш вопрос и все уточнения поставьте там
@Jabberwocky Большое спасибо за ваш ответ. Я выслушал ваш ответ и изменил результат кода: c56 c112 c179 c233 c300 я хочу поместить в данные temp[0] = Listbuffer[0]~[56], temp[1] = Listbuffer[57]~[112]... еще что я должен делать?
Наверняка это проблема: for (int i = 0; i <= ListSize; i++) -> for (int i = 0; i < ListSize; i++)
Нет, цикл for должен доходить до 300. Если вы вернетесь к 299, вы не сможете найти индекс 233~300 \n, потому что вы не можете пропустить нулевой символ.



Непонятно, чего вы пытаетесь добиться в основном цикле, но проблем больше:
вы должны выделить один дополнительный байт, чтобы установить нулевой терминатор в ListSize:
ListBuffer = malloc(ListSize + 1);
бесполезно устанавливать массив в 0 с помощью memset: выделение с помощью calloc(1, ListSize + 1) было бы более эффективным для этой цели, но, поскольку вы читаете содержимое в массив, сначала очищать его бесполезно.
fread может возвращать короткий счет, например, в текстовом режиме в устаревших системах преобразование последовательностей CR/LR в байты новой строки \n уменьшает количество прочитанных байтов:
ListSize = fread(ListBuffer, 1, ListSize, InputFile);
ListBuffer[ListSize] = '\0'; // set the null terminator
похоже, что вы очищаете буфер размером N байт, а затем читаете в него N байтов, так что нет места для нулевого терминатора
'\0'