检查行是否包含制表符、空格或新行C

检查行是否包含制表符、空格或新行C,c,C,我试图读入一个文件,然后检查它是否包含新行、制表符或空格 我目前正在使用fgets()读取文件,然后逐行检查该文件是否包含新行、空格或制表符 #包括 #包括 int main(){ 文件*fp; 字符行[255]; int非空白线=0; 整数=0; fp=fopen(“Test.java”,“r”); while(fgets(line,sizeof(line),fp)){ 如果(行!='\n'| |行!='\t'| |行!='\n'){ 非空行++; } 总计++; printf(“%s\n”,

我试图读入一个文件,然后检查它是否包含新行、制表符或空格

我目前正在使用
fgets()
读取文件,然后逐行检查该文件是否包含新行、空格或制表符

#包括
#包括
int main(){
文件*fp;
字符行[255];
int非空白线=0;
整数=0;
fp=fopen(“Test.java”,“r”);
while(fgets(line,sizeof(line),fp)){
如果(行!='\n'| |行!='\t'| |行!='\n'){
非空行++;
}
总计++;
printf(“%s\n”,第行);
}
fclose(fp);
printf(“总行数为%d\n”,总计行数);
printf(“非空白行总数为%d\n”,非空白行);
}
当我编译并运行程序时,总行数和空行数都是相同的

下面是我试图检查的java文件:

/**
*这是评论的第一行。
*这是评论中的另一行。
*评论在下面一行结束。
*/
同学们好{
公共静态void main(字符串[]args){
System.out.println(“你好”);
}
}
java
文件的底部附近有两行空行,我的程序无法读取


如何让程序读取这些字符?

您需要逐个字符迭代字符串,并检查所述字符是否为空白。这是一个函数,它接受字符串,如果只包含空格,则返回
1
,如果不包含空格,则返回
0

int isStringEmpty(const char *str) {
    while (*str) {
        if (*str != ' ' && *str != '\t' && *str != '\n'){
            return 0;
        }
        str++;
    }
    return 1;
}
您还可以修改实现以使用C的
isspace
函数,该函数将额外检查垂直选项卡、表单提要和回车

根据您的代码摘录,您可以使用如下函数:

if (!isStringEmpty(line)){
    nonBlankLines++;
}

您需要逐个字符迭代字符串,并检查所述字符是否为空白。这是一个函数,它接受字符串,如果只包含空格,则返回
1
,如果不包含空格,则返回
0

int isStringEmpty(const char *str) {
    while (*str) {
        if (*str != ' ' && *str != '\t' && *str != '\n'){
            return 0;
        }
        str++;
    }
    return 1;
}
您还可以修改实现以使用C的
isspace
函数,该函数将额外检查垂直选项卡、表单提要和回车

根据您的代码摘录,您可以使用如下函数:

if (!isStringEmpty(line)){
    nonBlankLines++;
}

您应该检查“\n”可能不够,因为在某些操作系统(如Windows)上,新行字符是用字符串“\r\n”指定的。这可能是您遇到的问题。

您应该检查“\n”可能不够,因为在某些操作系统(如Windows)上,新行字符是用字符串“\r\n”指定的。这可能是您遇到的问题。

提供一个实际编译的完整程序,您会得到一个分数。如果不启用编译器警告/不读取警告,则会扣除大约相同的值

Gcc警告说,即使没有额外的标志:

$ gcc -o char char.c
char.c: In function ‘main’:
char.c:14:13: warning: comparison between pointer and integer
     if(line != '\n' || line != '\t' || line != '\n'){
             ^~
[same for the other two]
您的
char[255]
,几乎在所有实际用途上都与
char*
相同,即指向
char
(或一组字符)的指针。但是,字符文本
'\n'
属于
char
类型。比较它们没有意义

如果需要字符串的第一个字符,请使用
行[0]
;或者,如果要比较整行,请使用strcmp(行“\n”)==0。不过请注意,您可能希望扫描整行以查看是否有任何非空白字符——输入可以是例如
“\n”
、两个空格和一个换行符

同时,更仔细地考虑你的病情。你有“X不是A或X不是B”。在每种情况下,在每个子条件下会发生什么:X是A,X是B,X是C


还请注意,如果输入中有换行符,则由
fgets()
返回的字符串始终包含一个换行符。

提供实际编译的完整程序是有道理的。如果不启用编译器警告/不读取警告,则会扣除大约相同的值

Gcc警告说,即使没有额外的标志:

$ gcc -o char char.c
char.c: In function ‘main’:
char.c:14:13: warning: comparison between pointer and integer
     if(line != '\n' || line != '\t' || line != '\n'){
             ^~
[same for the other two]
您的
char[255]
,几乎在所有实际用途上都与
char*
相同,即指向
char
(或一组字符)的指针。但是,字符文本
'\n'
属于
char
类型。比较它们没有意义

如果需要字符串的第一个字符,请使用
行[0]
;或者,如果要比较整行,请使用strcmp(行“\n”)==0。不过请注意,您可能希望扫描整行以查看是否有任何非空白字符——输入可以是例如
“\n”
、两个空格和一个换行符

同时,更仔细地考虑你的病情。你有“X不是A或X不是B”。在每种情况下,在每个子条件下会发生什么:X是A,X是B,X是C


还请注意,如果输入中存在一个换行符,则由
fgets()
返回的字符串始终包含一个换行符。

strcspn
搜索字符列表中第一个出现的字符并返回索引。如果未找到,则指向输入字符串的结尾

size_t index = strcspn(line, " \n\t");
if (index == strlen(line))
    printf("line contains no whitespaces\n");
else
    printf("first whitespace found at %u\n", index);

strcspn
搜索字符列表中第一个出现的字符并返回索引。如果未找到,则指向输入字符串的结尾

size_t index = strcspn(line, " \n\t");
if (index == strlen(line))
    printf("line contains no whitespaces\n");
else
    printf("first whitespace found at %u\n", index);

您正在尝试计算空行和非空行的总数。要知道行是否为空,我们只关注3种情况:

  • 如果换行符
    “\n”
    连续重复
    2次或更多次
  • 如果2'\n' 字符之间只有
    空格
    。在这里,我们假设2个'\n'字符是连续的,用于实现目的
  • 如果2
    '\n'
    具有 它们之间也有非空白字符
  • 情况1
    中,可以有
    1个或多个连续的空行。在
    情况2
    中,将出现
    1
    blan