0

こんにちは、

  if('\t' == input [0] ||'\v' == input [0] ||'\r' == input [0] ||'\n' == input [0] || '\0' == input[0] || '' == input[0])

inputはcharの配列です:)

これは、ファイル内の空白行をチェックするコードの行ですが、たとえば、空白行を取得することはありません。

私のコードは8桁の16進値を読み取り、無効な(すでにソートされている)場合、または空白またはEOFのある空の行がある場合に終了したいと思います。

私のファイルがこのような場合は機能します...1111111111111111

^空の行にスペースがありますが、スペースがない場合は、インフィティループに侵入するだけです。これは非常に煩わしいことです。

#define MAXIN 4096 
  static char input[MAXIN]; 
  char last;
    /*Reading the current line */
  fgets(input, MAXIN, f);;
  if (input[8] == '\r') input[8] = '\0';
  /* First of all check if it was a blank line, i.e. just a '\n' input...*/
  if('\t' == input [0] ||'\v' == input [0] ||'\r' == input [0] ||'\n' == input [0] || '\0' == input[0] || '' == input[0])
  {printf("##EMPTY");return(INERR);}
  if ('\n' == input[0]) return(INERR); 

 if ((sscanf(input,"%8x%c",&result,&last) < 2)) return(INERR);
  if ('\n' != last) return(INERR);  
}
4

3 に答える 3

2

の戻り値を確認する必要がありますfgets。この関数はNULL、「ファイルの終わり」のシグナルに戻ります。簡単に言えば、これを試してください:

if (!fgets(input, MAXIN, f))
    return INERR;
于 2012-02-18T16:56:35.640 に答える
1

このコードを使用して、行が空かどうかを確認できます。

typedef enum { false = 0, true } bool;

bool isEmptyLine(const char *s) {
  static const char *emptyline_detector = " \t\n";

  return strspn(s, emptyline_detector) == strlen(s);
}

そしてこのようにテストします:

fgets(line,YOUR_LINE_LEN_HERE,stdin);
    if (isEmptyLine(line) == false) {
        printf("not ");
    }
printf("empty\n");
于 2012-02-18T17:08:22.257 に答える
0

間違ったアプローチを使用しています。行が「\n」で終わっているかどうか、および行のその文字より前のすべての文字が印刷できないかどうかを確認する必要があります。最初の文字だけをチェックするだけでは不十分です。

それはそのようなものでなければなりません:

int len = strlen(input);

int isEmpty = 1;
if(input[--len] == '\n')
{
    while (len > 0)
    {
       len--;
       // check here for non printable characters in input[len] 
       // and set isEmpty to 0 if you find any printable chars

    }
}

if(isEmpty == 1)
   // line is empty
于 2012-02-18T16:52:30.493 に答える