#c #parsing #fileparsing
#c #синтаксический анализ #анализ файлов
Вопрос:
У меня есть динамически обновляемый текстовый файл с именами людей, я хочу проанализировать файл, чтобы извлечь «Калеб» и строку, которая следует за его именем. Однако его имя не всегда может быть в списке, и я хочу учесть это.
Я мог бы сделать это на Java, но даже не уверен, что делать на C. Я мог бы начать с чтения текстового файла построчно, но тогда как мне проверить, является ли «Калеб» подстрокой строки, которую я только что прочитал, и обработать случай, когда это не так? Я хочу сделать это без использования внешних библиотек — какой метод был бы лучшим?
Barnabas: Followed by a string
Bart: Followed by a string
Becky: Followed by a string
Bellatrix: Followed by a string
Belle: Followed by a string
Caleb: I want this string
Benjamin: Followed by a string
Beowul: Followed by a string
Brady: Followed by a string
Brick: Followed by a string
returns: "Caleb: I want this string" or "Name not found"
Ответ №1:
но тогда как мне проверить, является ли «Caleb» подстрокой строки
Суть вопроса, когда я его читаю. strstr
выполняет свою работу.
char *matchloc;
if ((matchloc = strstr(line, "Caleb:")) {
// You have a match. Code here.
}
Однако в данном конкретном случае, который вы действительно хотите, начинается с Caleb, поэтому мы делаем лучше с strncmp
:
if (!strncmp(line, "Caleb:", 6)) {
// You have a match. Code here.
}
Ответ №2:
Итак, если вы хотите проверить, существует ли пользователь caleb, вы можете просто создать strstr с вашим массивом строк, и если он существует, вы можете создать strtok, чтобы получить только строку!
Я не знаю, как вы открываете файл, но вы можете использовать getline для получения построчно!
Вы можете сделать что-то вроде этого:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *file;
char *fich="FILE.TXT";
char *line = NULL;
char *StringFile[100];
size_t len = 0;
ssize_t stringLength;
const char s[2] = ":"; //Divide string for this
char *token;
int check =0;
char *matchloc;
file=fopen(fich, "r");
if(file==NULL){
fprintf(stderr, "[ERROR]: cannot open file <%s> ", fich);
perror("");
exit(1);
}
while((stringLength = getline(amp;line, amp;len, file)) != -1){
if(line[strlen(line)-1] == 'n'){
line[strlen(line)-1] = ''; //Removing n if exists
}
if((matchloc = strstr(line, "Caleb:"))){
check = 1;
strcpy(*StringFile, line);
token = strtok(*StringFile, s);
while( token != NULL ) {
token = strtok(NULL, s);
printf("%sn", token);
break;
}
break;
}
}
if(check==0){
printf("Name not foundn");
}
return 0;
}
В коде могут быть некоторые ошибки, но идея в том, что! когда находит имя, скопируйте строку в array и разделите ее.