我是C的新手,在这里我有一个C程序,它将从命令行接收X量的文件并将文件输出到stdout但删除空白行。如果用户没有输入任何文件,它将直接从标准输入读取。
除了删除线条外,一切都能顺利运行。
这是我的程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define NUMCHARS 1024
int main (int argc, char** argv)
{
int good_file = 0;
if(argc <= 1){
good_file++;
test(stdin);
}
FILE* files[argc - 1];
int i;
for(i = 0; i < argc - 1; i++){
if ((files[i]=fopen(argv[i+1], "r"))==NULL){
continue;
}
else{
good_file++;
test(files[i]);
}
}
if(!good_file){
fprintf(stderr, "ERROR!\n");
}
}
int test (FILE *file)
{
char buffer[NUMCHARS];
while (fgets(buffer, NUMCHARS, file) != NULL)
part2(buffer);
fclose(file);
}
int part2 (char *buffer)
{
if(*buffer != '\n' || *buffer != '\t' || *buffer != ' '){ //if(*buffer != '\n') successfully deletes (skips) plain newlines
fputs(buffer, stdout);
}
}
在功能第2部分中,正如您通过我的评论所看到的,如果我将||
移至'\t'
并且该' '
已删除,则该程序将成功删除(跳过) 换行符if语句中的>>> A = (10, "mil")
>>> print(A)
Error: <repr(<__main__.Volume at 0x9ab7cc0>) failed: TypeError: __repr__ returned non-string (type NoneType)>
。但是很多空白行不一定是“空白”。即它们上面会有标签或白色空间。使用我删除换行符的逻辑,我将它应用于制表符和空格。
但是通过这个新的实现,它甚至不会跳过换行符。并且它不会起作用。
感谢您的反馈!
答案 0 :(得分:2)
你的情况总是如此,所以没有任何事情:
if (*buffer != '\n' || *buffer != '\t' || *buffer != ' ') {
fputs(buffer, stdout);
}
您要问&#34;第一个字符不是换行符还是不是制表符或不是空格?&#34;每个角色都可以这样说:空格不是换行符,换行符不是制表符。您需要检查该行中的所有字符:
int is_all_white(char *s) {
while (*s) {
if (!('\n' == *s || '\t' == *s || ' ' == *s)) return 0;
s += 1;
}
return 1;
}
...
if (! is_all_white(buffer)) {
fputs(buffer, stdout);
}
答案 1 :(得分:0)
以下if
声明的条件
if(*buffer != '\n' || *buffer != '\t' || *buffer != ' ')
对于每一行都是如此。
您应该更改要使用的逻辑:
int isBlankLine(char const* line)
{
for ( ; *line != '\0'; ++line )
{
if ( !isspace(*line) )
{
return 0;
}
}
return 1;
}
int part2 (char *buffer)
{
if (!isBlankLine(buffer) )
{
fputs(buffer, stdout);
}
}
答案 2 :(得分:0)
您的if
条件始终满足 - 您检查缓冲区的第一个字符是否不是换行符,如果是换行符,则检查它是否不是标签。
您可以将条件中的所有||
替换为&&
- 这意味着第一个字符不是换行符,空格或制表符的每一行都会被打印出来。
您真正想要做的是使用[isspace]
1功能检查该行的每个字符。如果存在非空白字符,则可以打印它。
答案 3 :(得分:-2)
if(*buffer != '\n' || *buffer != '\t' || *buffer != ' '){
fputs(buffer, stdout);
}
替换为
char c;
if(1==sscanf(buffer, " %c", &c)){
fputs(buffer, stdout);
}