“如何复制”;2无此类文件或目录“;在C中

“如何复制”;2无此类文件或目录“;在C中,c,exception,arguments,C,Exception,Arguments,我知道这听起来可能很奇怪,但我正试图找出在向主程序传递错误参数时何时会出现这种类型的错误 假设我有一个接受1或2个参数的程序。如果是2个参数,则只能是: argv[0] =./programName 及 “-A”以外的任何其他argv[1]都需要打印“2无此类文件或目录”消息 据我所知,这是一条系统消息,所以打印它对我不起作用 我是否需要将所有可能的主参数保存在一个文件中,然后将键入的参数与文件中的参数进行比较 目前我的做法是: #include <unistd.h> #incl

我知道这听起来可能很奇怪,但我正试图找出在向主程序传递错误参数时何时会出现这种类型的错误

假设我有一个接受1或2个参数的程序。如果是2个参数,则只能是:

argv[0] =./programName 

“-A”以外的任何其他argv[1]都需要打印“2无此类文件或目录”消息

据我所知,这是一条系统消息,所以打印它对我不起作用

我是否需要将所有可能的主参数保存在一个文件中,然后将键入的参数与文件中的参数进行比较

目前我的做法是:

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/times.h>
#include <sys/wait.h>

int main (int argc, char *argv[]){
.....
...

if (argc == 2 && strcmp(argv[1], ARGV_2)!=0){
return(EXIT_FAILURE);
}

...
.....
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
.....
...
如果(argc==2&&strcmp(argv[1],argv_2)!=0){
返回(退出失败);
}
...
.....
}

我认为
ls
通过
error()函数实现这一点:

函数:无效错误(int status,int errnum,const char*format,…)

初步说明:| MT安全区域设置|不安全损坏堆i18n | AC安全 |请参阅POSIX安全概念

错误函数可用于报告运行期间的一般问题 程序执行。format参数是一个格式字符串,就像 那些被赋予printf函数族的函数。所需的参数 对于格式,可以遵循format参数。就像佩罗一样, 错误还可以以文本形式报告错误代码。但不像佩罗 错误值显式传递给errnum中的函数 参数这就消除了上面提到的错误 必须在函数之后立即调用reporting函数 导致错误的原因是,否则errno可能具有不同的值

错误首先打印程序名。如果应用程序定义了 全局变量错误\u print\u progname并将其指向此函数 函数将被调用以打印程序名。否则 使用全局变量program_name中的字符串。程序名 后接冒号和空格,空格后接 由格式字符串生成的输出。如果errnum参数为 非零格式字符串输出后面跟一个冒号和一个空格, 然后是错误代码errnum的错误消息。无论如何 输出以换行符终止

输出被定向到stderr流。如果斯特德没有 在调用之前定向,在调用之后将是狭义定向

除非状态参数为非零,否则函数将返回 价值在这种情况下,函数将使用状态值调用exit 对于其参数,因此永远不会返回。如果返回错误,则 全局变量错误\消息\计数增加1以保持 跟踪报告的错误数

因此,也许像这样的事情可以实现OP的目标,以及之前建议的其他答案:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <error.h>

int main(int argc, char* argv[])
{
    if (argc == 2 && strcmp(argv[1], "-A") != 0) {
        error(ENOENT, ENOENT, "cannot access %s", argv[1]);
    }

    printf("program didn't get to here\n");
}

你为什么不能把它打印出来?您显示的代码摘录看起来几乎不错,但只是缺少打印输出。不,在C标准中没有“系统消息”。我还说代码看起来几乎不错,因为您有一个逻辑错误:在执行程序时尝试添加多个参数。
fprintf(stderr,“此处的错误消息。\n”)
#包括
#包括
#包括
printf(“%s”,strerror(enoint))。什么系统的系统消息?@Someprogrammerdude显然应该是系统消息,而不是n error printf消息。我已经完成的EXPERT工作得很好,但默认情况下不会打印任何消息。我想知道的是,如果一条消息,比如“没有这样的文件或目录”,它只与文件/目录相关,但失败了,在这种情况下,我很可能必须将可能的参数存储在一个文件中,以便与之进行比较。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <error.h>

int main(int argc, char* argv[])
{
    if (argc == 2 && strcmp(argv[1], "-A") != 0) {
        error(ENOENT, ENOENT, "cannot access %s", argv[1]);
    }

    printf("program didn't get to here\n");
}
~/workspace/tests/ $ ./ctest bogus_dir
./ctest: cannot access bogus_dir: No such file or directory
~/workspace/tests/ $ ls bogus_dir
ls: cannot access bogus_dir: No such file or directory