我有一个包含标题信息的ASCII文件。标题中的一行是这样的:
# John Q. Public et al. 2014, to be submitted
我想知道这个名字。这是我的代码:
sscanf(line,"# %s et al.",NAME);
不幸的是,它只获得了第一个名字。注意:名称可以是由空格分隔的1个或多个标记。基本上,我需要在第一个哈希标记和“等”之间获取所有内容。到一个字符串(char *)变量。
有什么建议吗?感谢。
答案 0 :(得分:1)
以防你需要原生的东西:
bool readName(const char *line, char *name, int bufferSize)
{
const char *hash = strstr(line, "# ");
if(!hash)
return false;
const char *etal = strstr(hash+2, " et al.");
if(!etal)
return false;
size_t numChars = min(etal-hash-2, bufferSize-1);
strncpy(name, hash+2, numChars);
name[numChars] = '\0';
return true;
}
答案 1 :(得分:0)
我会将内容读入内存,因为@pgm建议然后使用regular expressions来提取名称。在不知道您正在使用的平台/库的情况下,我无法提供具体示例。
答案 2 :(得分:0)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void between(const char *str, const char *key1, const char *key2, char *out){
char *from, *to, *p;
*out = '\0';
from = strstr(str, key1);
if(!from) return ;
from += strlen(key1);
to = strstr(from, key2);
if(!to) return ;//or rest ?
while(isspace(*from))
++from;
while(isspace(*--to))
;
for(p = from; p <= to; )
*out++ = *p++;
*out = '\0';
}
int main(){
char line[] = "# John Q. Public et al. 2014, to be submitted";
char NAME[32];
between(line, "#", "et al.", NAME);
printf("<%s>\n", NAME);//<John Q. Public>
return 0;
}