在我的一个程序中,我调用了一个以main()为单位的函数,如下所示: function(stdin, stdout); 我的main函数如下所示:

int main() {
    function(stdin, stdout);      
    return 0;
}

我想问一下,有没有办法添加一些支票,这样如果有人写了一些不是./program < input > output的东西,就会打印错误消息.

推荐答案

如果用户输入的内容如下:"./PROGRAM<;INPUT&>OUTPUT",则无法完全确定

但是,您可以做一些事情来拉近距离:

1.)您可以确保参数计数小于2.(重定向到标准输入的文件不会增加参数计数)

2.)您可以在您的文件input中创建特殊的标题.在此示例代码中,我们将确保文件头以#####(5磅符号)开头.

以下是经过编译和测试的代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
int ch, count = 0;

    /* 1st check:  A file redirected to stdin should add zero to arg count */
    if(argc > 1)
    {
        printf("Invalid input: argc: %d\n", argc);
        return 0;
    }

    /* The file that we are expecting to be redirected 
    * to stdin must start with 5 pound signs (#####)
    * File Format: ##### Follow-on data....
    */
    do{
        ch = getchar();
        printf("%c ", ch);
        if((ch&0xFF) == '#')
            count++;
        else
            break;
    }while(1);

    if(count != 5)
    {
        printf("Invalid input: file did not begin with ##### header. # Count: %d\n", count);
        return 0;
    }
    else
        printf("Tests passed for valid input.  # Count: %d\n", count);

    return 0;
}

请注意,如果在没有命令行输入的情况下启动程序,则键入#####并按Enter键,程序将报告输入成功/有效.这就是我告诉"你不可能完美地发现……"的一个原因,因为你可以用努力来挫败意图和判断.

C++相关问答推荐

如何将匿名VLA分配给指针?

ISO_C_BINDING,从Fortran调用C

strftime函数中%s的历史意义是什么?为什么没有记录?

了解一些CLIPS原语数据类型

C指针算法在函数参数中的应用

如何在C中从函数返回指向数组的指针?

函数的限制限定指针参数允许优化调用方函数吗?

为什么数组的最后一个元素丢失了?

运行时错误:在索引数组时加载类型为';char';`的空指针

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

程序对大输入给出错误答案

如何在C中处理流水线中的a、n命令?

我的代码可以与一个编译器一起使用,但不能与其他编译器一起使用

在列表中查找素数

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

Struct 内的数组赋值

(GNU+Linux) 多个线程同时调用malloc()

int 与 size_t 与 long

strlen 可以是[[未排序]]吗?

我们可以在不违反标准的情况下向标准函数声明添加属性吗?