从C中的一行读取带空格的子字符串

时间:2014-03-14 16:15:15

标签: c substring scanf

我有一个包含标题信息的ASCII文件。标题中的一行是这样的:

# John Q. Public et al. 2014, to be submitted

我想知道这个名字。这是我的代码:

sscanf(line,"# %s et al.",NAME);

不幸的是,它只获得了第一个名字。注意:名称可以是由空格分隔的1个或多个标记。基本上,我需要在第一个哈希标记和“等”之间获取所有内容。到一个字符串(char *)变量。

有什么建议吗?感谢。

3 个答案:

答案 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;
}