我有一个动态更新的带有人名的文本文件,我想解析该文件以提取"Caleb";以及他名字后面的字符串。然而,他的名字可能并不总是在名单上,我想解释一下。
我可以用Java来做,但甚至不确定在C中该做什么;Caleb";是我刚读入的字符串的子字符串,当他不是的时候处理这个情况?我想在不使用外部库的情况下做到这一点——什么是最好的方法?
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"
,但我该如何检查;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.
}
因此,如果你想检查用户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(&line, &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;
}
代码,可能有一些错误,但想法是!找到名称后,将行复制到数组中,然后进行拆分。