I';我遇到了一个非常奇怪的定时错误,在我认为应该发生的事情之前,有些事情正在执行 #包括 #包括 #包括 #包括 #包括 #包括 int c,n,E,b,s,v,t,opt,valid=0; 当前字符='\0'; char previous='\0'; 文件*fp; /*-n个数字行 *-E在行尾附加一个美元符号 *-b仅限非空行的数字 *-s将多个空行压缩到1 *-v显示控制字符,不包括制表符 *-t包括上面的选项卡 *-e与-e和-v相同 */ int setFlags(int argc,char*argv[]){ int op; 而((op=getopt(argc,argv,“nEbsvte”)!=-1){ 开关(op){ 案例“n”:{ n=1; 打破 }案例“E”:{ E=1; 打破 }案例“b”:{ b=1; 打破 }案例s:{ s=1; 打破 }案例“v”:{ v=1; 打破 }案例“t”:{ t=1; 打破 }案例“e”:{ E=1; v=1; 打破 }案例“?”:{ //fprintf(stderr,“选项`-%c`无效。\n”,optopt); 返回退出失败; }默认值:{ 中止(); } } } opt=optind; 如果(n==1){ b=0; } 返回退出成功; } int检查文件(字符*路径){ if(访问(路径,R_OK)==0){ 返回退出成功; }否则{ fprintf(标准字符,“类别:%s:%s\n”,argv[i],strerror(errno)); errno=0; 返回退出失败; } } int doPrint(字符*路径){ if(strcmp(路径,“stdin”)==0){ fp=stdin; }否则{ 如果(检查文件(路径)==1){ 返回退出失败; }否则{ fp=fopen(路径“r”); } } 而((c=fgetc(fp))!=EOF){ 普查尔(c); } fclose(fp); 返回退出成功; } int main(int argc,char*argv[]){ 如果(设置标志(argc,argv)==1){ fprintf(stderr,“程序因错误而终止。\n” “指定的选项无效。\n”); 返回退出失败; }否则{ 如果((argc-opt)==0){ doPrint(“标准数据”); }否则{ for(int i=opt;i

I';我遇到了一个非常奇怪的定时错误,在我认为应该发生的事情之前,有些事情正在执行 #包括 #包括 #包括 #包括 #包括 #包括 int c,n,E,b,s,v,t,opt,valid=0; 当前字符='\0'; char previous='\0'; 文件*fp; /*-n个数字行 *-E在行尾附加一个美元符号 *-b仅限非空行的数字 *-s将多个空行压缩到1 *-v显示控制字符,不包括制表符 *-t包括上面的选项卡 *-e与-e和-v相同 */ int setFlags(int argc,char*argv[]){ int op; 而((op=getopt(argc,argv,“nEbsvte”)!=-1){ 开关(op){ 案例“n”:{ n=1; 打破 }案例“E”:{ E=1; 打破 }案例“b”:{ b=1; 打破 }案例s:{ s=1; 打破 }案例“v”:{ v=1; 打破 }案例“t”:{ t=1; 打破 }案例“e”:{ E=1; v=1; 打破 }案例“?”:{ //fprintf(stderr,“选项`-%c`无效。\n”,optopt); 返回退出失败; }默认值:{ 中止(); } } } opt=optind; 如果(n==1){ b=0; } 返回退出成功; } int检查文件(字符*路径){ if(访问(路径,R_OK)==0){ 返回退出成功; }否则{ fprintf(标准字符,“类别:%s:%s\n”,argv[i],strerror(errno)); errno=0; 返回退出失败; } } int doPrint(字符*路径){ if(strcmp(路径,“stdin”)==0){ fp=stdin; }否则{ 如果(检查文件(路径)==1){ 返回退出失败; }否则{ fp=fopen(路径“r”); } } 而((c=fgetc(fp))!=EOF){ 普查尔(c); } fclose(fp); 返回退出成功; } int main(int argc,char*argv[]){ 如果(设置标志(argc,argv)==1){ fprintf(stderr,“程序因错误而终止。\n” “指定的选项无效。\n”); 返回退出失败; }否则{ 如果((argc-opt)==0){ doPrint(“标准数据”); }否则{ for(int i=opt;i,c,file,printing,io,C,File,Printing,Io,我遇到了一个非常疯狂的错误,我的程序在完成写入文件内容之前(总是在结束前一次聊天)在checkFile中输出错误行 这让我发疯,不管我把那段代码移到哪里,它都不能按预期工作 我相信答案可能很琐碎,但它让我感到困惑。在输出完成之前,我甚至抛出了sleeps和其他一些东西,它会抛出错误,然后是sleep,然后打印最后一个字符 有任何帮助吗?使用printf时,stdout输出默认为缓冲。这意味着它可以与其他输出交错,通常来自stderrstderr是无缓冲的,因此当出现错误时,它的输出会立即打印出来

我遇到了一个非常疯狂的错误,我的程序在完成写入文件内容之前(总是在结束前一次聊天)在checkFile中输出错误行

这让我发疯,不管我把那段代码移到哪里,它都不能按预期工作

我相信答案可能很琐碎,但它让我感到困惑。在输出完成之前,我甚至抛出了sleeps和其他一些东西,它会抛出错误,然后是sleep,然后打印最后一个字符


有任何帮助吗?

使用
printf
时,
stdout
输出默认为缓冲。这意味着它可以与其他输出交错,通常来自
stderr
<默认情况下,code>stderr是无缓冲的,因此当出现错误时,它的输出会立即打印出来,这通常是需要的

通过明智地使用
fflush
或使用
setbuf
关闭
stdout
的文件缓冲,可以修复交错。请务必阅读setbuf的手册页,因为其中有一些注意事项


在这种情况下,在doPrint函数末尾添加fflush(stdout)应该可以解决“问题”。

Ah,good ol'全局变量。我甚至懒得再看下去了。我相当缺乏经验,所以我真的不知道怎么做。我在doPrint中有int c和FILE*fp;让他们觉得这可能有用。其余的人只设定了一次,从那一点开始阅读;继续使用它们似乎是不必要的工作。函数可以接受参数。利用这个有趣的事实。你的
fp
变量只在一个函数中使用。当它不是必须的时候,不要让它全球化。此外,您可以创建一个结构来保存所有重要的内容,然后传递该结构(因此只有一个变量可以传递)。尽管如此,我不知道您的问题是什么。您能给我们一些您尝试过的示例输入,以便我们进行测试吗?谢谢您的帮助和解释!不客气,有时候一张照片胜过千言万语
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

int c, n, E, b, s, v, t, opt, valid = 0;
char current = '\0';
char previous = '\0';
FILE *fp;

/*  -n numbers lines
 *  -E appends a dollar sign to line ends
 *  -b numbers only non-blank lines
 *  -s squeezes multiple blank lines down to 1
 *  -v displays control chars, excluding tab
 *  -t includes tab in the above
 *  -e is the same as -E and -v
 */

int setFlags(int argc, char *argv[]) {
    int op;
    while ((op = getopt(argc, argv, "nEbsvte")) != -1) {
        switch (op) {
            case 'n': {
                n = 1;
                break;
            } case 'E': {
                E = 1;
                break;
            } case 'b': {
                b = 1;
                break;
            } case 's': {
                s = 1;
                break;
            } case 'v': {
                v = 1;
                break;
            } case 't': {
                t = 1;
                break;
            } case 'e': {
                E = 1;
                v = 1;
                break;
            } case '?': {
                //fprintf(stderr, "Option `-%c` is not valid.\n", optopt);
                return EXIT_FAILURE;
            } default: {
                abort();
            }
        }
    }
    opt = optind;

    if(n == 1) {
        b = 0;
    }

    return EXIT_SUCCESS;
}

int checkFile(char *path) {
    if (access(path, R_OK) == 0) {
        return EXIT_SUCCESS;
    } else {
        fprintf(stderr, "cat: %s: %s\n", argv[i], strerror(errno));
        errno = 0;
        return EXIT_FAILURE;
    }
}

int doPrint(char *path) {
    if (strcmp(path, "stdin") == 0) {
        fp = stdin;
    } else {
        if (checkFile(path) == 1) {
            return EXIT_FAILURE;
        } else {
            fp = fopen(path, "r");
        }
    }
    while ((c = fgetc(fp)) != EOF) {
        putchar(c);
    }
    fclose(fp);
    return EXIT_SUCCESS;
}

int main (int argc, char *argv[]) {
    if (setFlags(argc, argv) == 1) {
        fprintf(stderr, "The program has terminated with an error.\n"
        "An invalid option was specified.\n");
        return EXIT_FAILURE;
    } else {
        if ((argc - opt) == 0) {
            doPrint("stdin");
        } else {
            for(int i = opt; i < argc; i++) {
                doPrint(argv[i]);
            }
        }
    }
}