fscanf错误处理不需要的输入

时间:2017-08-23 04:05:06

标签: c

我试图了解如何使用fscanf处理一些不需要的输入。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    FILE *myFile;
    myFile = fopen("../map1.map", "r");
    if (myFile == NULL){
        printf("Couldn't open file.\n");
        exit(-1);
    }

    char buffer[16];

    if (fscanf(myFile, "%15s", buffer) != 1){
        printf("The file is not formated correctly.\n");;
        fclose(myFile);
        exit(-1);
    }
}

我有这个代码。我想确保在这些场景中打印错误然后退出程序(我不关心我想要退出的溢出字符会发生什么):

  1. 无法找到/打开文件。 (这有效)

  2. 缓冲区溢出。在这种情况下,我不希望它只抓取前15个字符。我希望程序退出。我还希望能够在程序中稍后继续阅读该文件。如果文件中有更多行,则无关紧要。 (这是主要问题)。

  3. 我根本没有任何价值(这很有效。)

  4. 我得到2个单词(例如:&#34;你好&#34; = 1个单词,&#34;你好世界&#34; = 2个单词)(我也不知道这个)

  5. 我想知道如何测试这些东西。我使用什么比较等。

    我不是一个非常有经验的用户,所以请指出任何明显的缺陷,我会解决它们。

    让它更清晰。我不想让这项工作。我想知道如果它不起作用退出。这与预期的输入一起工作正常。

3 个答案:

答案 0 :(得分:1)

For 2.您可以进行早期检测 -

int length;
fscanf(myFile, "%*[^\n]%n",&length);
if(length > 10)
    //exit with failure

然后,您可以再次将长度与10进行比较。请记得fseek回到你正在使用的地方

fseek(myFile, -length, SEEK_CUR);        

对于案例4 - 因为你已经知道结束了所有你需要做的就是读一个单词并检查你是否已阅读全部 -

fscanf(myFile, "%15s", buffer);
if (strlen(buffer) < length)
    //return failure and exit

答案 1 :(得分:0)

首先,您的缓冲区需要足够大,以存储从文件中读取的字符,包括终止空字符:

fscanf(myFile, "%15s", buffer)

所以你的缓冲区需要 16 个字符大!

然后检查字符串是否被切断,再读一个字符(!):

char buffer[17]; // sufficiently large to store string + 0 character
if (fscanf(myFile, "%16s", buffer) != 1)
//                    ^ (!)

然后检查字符串长度:

else if(strlen(buffer) > 15)
    // invalid string

编辑:处理多个单词&#39;问题...

假设您已经如上所述成功阅读了这个词,那么您还需要检查是否还有另一个词。所以你需要分析以下空白的其余部分:

for(char c = fgetc(myFile); c != EOF && c != '\n'; c = fgetc(myFile))
//                                        ^ not the desired one
//                            ^ not end of file, we are not yet done
{
    if(!isspace((unsigned char)c))
        exit(-1); // undesired non-whitespace (-> multiple words)
}

当你退出时,你不需要关心丢失后续单词的第一个字符......

答案 2 :(得分:0)

试试这个

char buffer[32+1];//First prepare a buffer of sufficient length.
char word[16+1], extra_word[4];

if (fscanf(myFile, "%32[^\n]%*c", buffer) != 1 || //try read one line (or use fgets)
    strlen(buffer)>16 || //Examine the length or length longer than the expected format
    sscanf(buffer, "%s %3s", word, extra_word) == 2){//extra word exist ?
    printf("The file is not formated correctly.\n");
    fclose(myFile);
    exit(-1);
}