Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C、 使用argv[]作为命令行参数_C_File_Argv - Fatal编程技术网

C、 使用argv[]作为命令行参数

C、 使用argv[]作为命令行参数,c,file,argv,C,File,Argv,我在这个程序上遇到了问题,当我使用stdin时,它工作得很好,但是当我修改它以从命令行获取字符时,它就不工作了。我知道我做错了什么,但不知道是什么,任何帮助都将不胜感激 说明和代码: /* Program prints the date in this form: September 13, 2010 allow the user to enter date in either 9-13-2010 or 9/13/2010 format, otherwise print '

我在这个程序上遇到了问题,当我使用stdin时,它工作得很好,但是当我修改它以从命令行获取字符时,它就不工作了。我知道我做错了什么,但不知道是什么,任何帮助都将不胜感激

说明和代码:

/* Program prints the date in this form: September 13, 2010
    allow the user to  enter date in either 9-13-2010 or 9/13/2010  
    format, otherwise print 'error'  */

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

char *month(int m)
{
    char *months[]={"January","February","March","April","May",
                "June", "July","August","September","October",
                "November","December"};
    return months[m-1];
}

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

    int m=0,d=0,y=0;

    FILE *fp;

    if((fp=fopen(argv[1],"rb")) == NULL)
    {
        fprintf(stderr,"Couldn't open the file. ");
        exit(EXIT_FAILURE);
    }


    printf("Type a date (mm-dd-yyyy) or (mm/dd/yyyy): \n");

    if(fscanf(fp,"%d%*[/-]%d%*[/-]%d",&m,&d,&y) != 3)  //store characters in variables
        {
            fprintf(stderr, "Not properly formatted.");
            exit(EXIT_FAILURE);
        }

    printf("%s %2d, %4d",month(m),d,y);

    return 0;
}
输出:

Couldn't open the file.

这里我们有一个通用的解决方案。可以通过文件(fscanf)、命令行(sscanf)或键入(scanf)传递日期

#包括
#包括
#包括
字符*月份(整数m)
{
字符*月份[]={“一月”、“二月”、“三月”、“四月”、“五月”,
“六月”、“七月”、“八月”、“九月”、“十月”,
“11月”、“12月”};
返回月份[m-1];
}
int main(int argc,char*argv[])
{
int m=0,d=0,y=0;
文件*fp;
int错误格式=0;
如果(argc>1)
{
if((fp=fopen(argv[1],“rb”))==NULL)
{
如果(sscanf(argv[1],%d%*[/-]%d%*[/-]%d“,&m,&d,&y)!=3)
错误格式=1;
}
其他的
{
如果(fscanf(fp,“%d%*[/-]%d%*[/-]%d”、&m、&d、&y)!=3)
错误格式=1;
}
}
其他的
{
printf(“键入日期(mm dd yyyy)或(mm/dd/yyyy):\n”);
如果(扫描频率(“%d%*[/-]%d%*[/-]%d”、&m、&d、&y)!=3)
错误格式=1;
}
如果(格式错误)
{
fprintf(stderr,“格式不正确”);
退出(退出失败);
}
printf(“%s%2d,%4d\n”,月份(m),d,y);
返回0;
}

我修改了您的程序,以解决您遇到的问题(并解决一些未定义的行为,简称“UB”),但仅此而已:

#include <stdio.h>
#include <stdlib.h>

const char *month(int m) {
    const char const *months[] = {
        "January", "February", "March", "April",
        "May", "June", "July", "August",
        "September", "October", "November", "December",
    };

    if (1 <= m && m <= 12) {
        return months[m - 1];
    } else {
        return NULL;
    }
}

int main(int argc, char *argv[]) {
    int m = 0, d = 0, y = 0;

    if (argc == 2) {
        if (sscanf(argv[1], "%d%*[/-]%d%*[/-]%d", &m, &d, &y) != 3) {
            fprintf(stderr, "Not properly formatted.");
            exit(EXIT_FAILURE);
        }

        printf("%s %2d, %4d", month(m), d, y);
    } else {
        fprintf(stderr, "Please provide one date argument to the program, formatted as mm-dd-yyyy or mm/dd/yyyy\n");
        exit(EXIT_FAILURE);
    }

    return 0;
}
#包括
#包括
常量字符*月份(整数m){
常量字符常量*月份[]={
“一月”、“二月”、“三月”、“四月”,
“五月”、“六月”、“七月”、“八月”,
“九月”、“十月”、“十一月”、“十二月”,
};

如果(1)我使用codeblocks ide,我在程序参数窗口中键入01/30/1990,我也使用gcc运行它,它会显示“系统无法接受您输入的日期”。“客户端不拥有所需的特权”。
fopen(“01/30/1999”,“rb”)
将尝试打开路径为
01/30/1999
的文件。显然,不存在此类文件。
argv[1]
具有未定义的行为,除非您之前确定
argc
至少为两个。不要在
fp
上使用
fscanf
(文件-
scanf
),而是使用
sscanf
(字符串-
scanf
)在
argv[1]
上,尝试
perror(argv[1])
,而不是
fprintf(stderr,“无法打开文件”);
(这会产生几乎无用的错误消息),它会准确地告诉您问题所在。OP的评论显示这不是他们想要的:“如何从命令行获取输入,然后提取信息以将其放入变量中?“m、d和y都是变量。这不是重点。OP希望从命令行读取输入,而不是从命令行上指定的文件。好的,@Rhymoid。现在它也可以与命令行一起使用。谢谢您的评论,+1的回答也是正确的!”!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* month(int m)
{
    char* months[] = { "January", "February", "March", "April", "May",
        "June", "July", "August", "September", "October",
        "November", "December" };
    return months[m - 1];
}

int main(int argc, char* argv[])
{
    int m = 0, d = 0, y = 0;

    FILE* fp;

    int wrongFormat = 0;

    if (argc > 1) 
    {
        if  ((fp = fopen(argv[1], "rb")) == NULL) 
        {
            if (sscanf(argv[1], "%d%*[/-]%d%*[/-]%d", &m, &d, &y) != 3) 
                wrongFormat = 1;
        }
        else 
        {
            if (fscanf(fp, "%d%*[/-]%d%*[/-]%d", &m, &d, &y) != 3)
                wrongFormat = 1;
        }
    }
    else 
    {
        printf("Type a date (mm-dd-yyyy) or (mm/dd/yyyy): \n");
        if (scanf("%d%*[/-]%d%*[/-]%d", &m, &d, &y) != 3)
            wrongFormat = 1;
    }

    if (wrongFormat) 
    {
        fprintf(stderr, "Not properly formatted.");
        exit(EXIT_FAILURE);
    }

    printf("%s %2d, %4d\n", month(m), d, y);

    return 0;
}
#include <stdio.h>
#include <stdlib.h>

const char *month(int m) {
    const char const *months[] = {
        "January", "February", "March", "April",
        "May", "June", "July", "August",
        "September", "October", "November", "December",
    };

    if (1 <= m && m <= 12) {
        return months[m - 1];
    } else {
        return NULL;
    }
}

int main(int argc, char *argv[]) {
    int m = 0, d = 0, y = 0;

    if (argc == 2) {
        if (sscanf(argv[1], "%d%*[/-]%d%*[/-]%d", &m, &d, &y) != 3) {
            fprintf(stderr, "Not properly formatted.");
            exit(EXIT_FAILURE);
        }

        printf("%s %2d, %4d", month(m), d, y);
    } else {
        fprintf(stderr, "Please provide one date argument to the program, formatted as mm-dd-yyyy or mm/dd/yyyy\n");
        exit(EXIT_FAILURE);
    }

    return 0;
}