测试文件中字符串中的 space

Test the space in a string from a file

我正在尝试测试 file.txt 中的字符是否为 space ' ' 或不使用此代码:

char *Appartient (FILE *f, char *S)
{
    int i = 0, nbdechar = 0, nbocc = 0, PosdePremierChar, space = 0;
    char c;
    while ((c = getc(f)) != EOF) {
        PosdePremierChar = ftell(f);
        if (c == S[0]) {
            nbdechar = 0;
            for (i = 1; i < strlen(S); i++) {
                c = getc(f);
                if (c == S[i]) {
                    nbdechar++;
                }
            }
            if (nbdechar == strlen(S) - 1) {
                nbocc++;
            } else {
                rewind(f);
                fseek(f, PosdePremierChar - 1, SEEK_CUR);
                while ((c = getc(f)) != ' ');
            }
        } else {
            while ((c = getc(f)) != ' ') {
                space++;
            }
        }
    }
    printf("\n Le nb d'occurence est %d", nbocc);
    if (nbocc == 0) {
        return "false";
    } else {
        return "true";
    }
}

但是当我在我的调试器中检查变量 'c' 时,一个奇怪的符号 '' 像垃圾一样出现:

怎么了

可能是将getc()EOF(标准化为负数,通常为-1)的文件结尾结果转换为字符的结果。

请注意,如果文件中没有 space,您的循环将永远不会终止,因为 EOF != ' ' 并且在您第一次到达文件末尾后该条件一直为真。

您没有测试 f 是否打开,如果没有打开,则 未定义的行为 将发生,请检查文件是否打开

FILE *file;
int   chr;

if ((file = fopen("test.txt", "r")) == NULL)
 {
    fprintf(stderr, "Cannot open `test.txt'\n");
    return -1;
 }

while (((chr = fgetc(file)) != EOF) && (chr == ' '))
    printf("space\n");

您应该声明 chr 类型 int,因为 fgetc() returns 一个 int,例如 EOF 需要int 而不是 char.

此外,调试模式对于跟踪变量的值很有用,我敢打赌,如果您知道的话,它可以根据您的需要提供 ascii、十进制或十六进制的五个值怎么问。

像这样修改你的代码,跟踪它,你可能会对 getc() returns 之间的关系以及它与 chars 的关联方式有所启发:

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


int main(void)  
{
  int result = EXIT_SUCCESS;

  FILE * f = fopen("test.txt", "r");
  if (NULL == f)
  {
    perror("fopen() failed");
    result = EXIT_FAILURE;
  }
  else 
  {
    int result = EOF;

    while (EOF != (result = getc(f)))
    {
      char c = result;

      printf("\n%d is 0x%02x is '%c'", result, result, c);
      if (' ' == c)
      {
        printf(" is space ");
      }
    }

    printf("\nread EOF = %d = 0x%x\n", result, result); 

    fclose(f);
  }

  return result;
}