0

因此,当前函数应该看到存储在两个井号之间的任何内容(#abc# 应该返回 abc),但是如果我想错误检查是否缺少井号,或者井号之间没有任何内容,或者两个井号之间的字符串长度大于一定数量的字符,我是否使用 fscanf 函数来做到这一点?

fscanf 代码如下所示:

if (fscanf(fp, " %c%[^#]%c", &start, buffer, &end) == 3) {
    return strdup(buffer);      
} else { 
    return NULL; 

}

4

2 回答 2

1

如果您需要处理零字符的情况,那么可能fscanf()不是正确的工具。有一个合理的论点fscanf()很少是正确的工具;你会做得更好fgets()sscanf()

在这种情况下,我会收集行,直到有一个不是空白的(因为这就是它fscanf()所做的),然后用 搜索#符号strchr()

char line[4096];
while (fgets(line, sizeof(line), fp) != 0)
{
    if (strspn(line, " \t\n") == strlen(line))
        continue;
    char *hash1 = strchr(line, '#');
    if (hash1 == 0)
        ...error no hashes...
    else
    {
        char *hash2 = strchr(hash1+1, '#');
        if (hash2 == 0)
            ...second hash is missing...
        if (hash2 - hash1 > MAX_PERMITTED_STRING_LEN)
            ...too long a string...
        *hash2 = '\0';
        char *res = strdup(hash1);
    }
}
于 2013-04-13T07:13:37.820 回答
1

我应该使用 fscanf 函数来做到这一点吗?

不,你没有。使用scanf()函数族很少是一个好主意。

char buf[0x1000];

// expect leading `#'
int ch = fgetc(fp);
if (ch != '#') {
    puts("Error, missing # at beginning of input");
    exit(-1);
}

// read until terminating `#' or until the buffer is exhausted
char *p = buf;
while ((ch = fgetc(fp)) != '#' && p - buf < sizeof(buf)) {
    *p++ = ch;
}

// expect terminating `#'
if (ch != '#') {
    puts("Error, missing # at end of input");
    exit(-1);
}
于 2013-04-13T07:09:09.220 回答