检查行是否包含制表符、空格或新行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'字符是连续的,用于实现目的'\n'
具有
它们之间也有非空白字符情况1
中,可以有1个或多个连续的空行。在情况2
中,将出现1
blan