Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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[]中的Int将中断并仅打印Int_C_Argv - Fatal编程技术网

C argv[]中的Int将中断并仅打印Int

C argv[]中的Int将中断并仅打印Int,c,argv,C,Argv,所以我知道这是最基本的,但我不知道在哪里可以找到正确的答案。问题是,我需要运行一个带有参数-s的程序,后面跟一个数字,告诉它要跳过多少个输入字符,比如说我们需要(我在bash中运行它): 它应该只打印e,但是shell会给我 2someone@somewhere: 在这一点上,我被困了好几个小时,没办法弄清楚,请帮帮我 int main(int argc, char *argv[]) { char s; char input[8196]; int i = 0; /

所以我知道这是最基本的,但我不知道在哪里可以找到正确的答案。问题是,我需要运行一个带有参数-s的程序,后面跟一个数字,告诉它要跳过多少个输入字符,比如说我们需要(我在bash中运行它):

它应该只打印
e
,但是shell会给我

2someone@somewhere:

在这一点上,我被困了好几个小时,没办法弄清楚,请帮帮我

int main(int argc, char *argv[]) {
    char s;
    char input[8196];
    int i = 0;
    /* above initialized are variables needed for the root of the program to work */
    int s_num = 0; /* "-s" or skip */
    int cnt_1; /* lvl1 counter */
    /* Getting input */
    while ((s = getchar()) != EOF) {
        input[i] = s;
        printf("%d\n", i);
        i++;
    }

    /* If calling w/o arguments, the only thing that works */
    if (argc == 1) {
        //do stuff
    }

    /* Argument Check */  
    if (argc > 1) {
        printf("1\n");
        for (cnt_1 = 0; cnt_1 < argc; cnt_1++) {
            printf("2\n");

            if (strcmp(argv[cnt_1], "-s") == 1) {
                printf("3.1\n");
                int pom = cnt_1 + 1;
                int bqs = 0;
                for (int i = 0; argv[pom][i] != '\0'; ++i) {
                    bqs *= 10; bqs += argv[pom][i] - '0';
                }
                s_num = bqs;
            }
            ...
intmain(intargc,char*argv[]){
字符s;
字符输入[8196];
int i=0;
/*上面初始化的是程序根运行所需的变量*/
int s_num=0;/*“-s”或跳过*/
int cnt_1;/*lvl1计数器*/
/*获取输入*/
而((s=getchar())!=EOF){
输入[i]=s;
printf(“%d\n”,i);
i++;
}
/*如果调用w/o参数,唯一有效的方法是*/
如果(argc==1){
//做事
}
/*参数检查*/
如果(argc>1){
printf(“1\n”);
对于(cnt_1=0;cnt_1
这应该是0。
strcmp
在相等时返回0

01 2 3 1 2 3.1.2

这就是我从输出中得到的结果,也是可以预期的,因为最后一个是-s的值。你确定你的strcmp工作正常吗

这应该是0。
strcmp
在相等时返回0

01 2 3 1 2 3.1.2


这就是我从输出中得到的结果,也是可以预期的结果,因为最后一个参数是-s的值。您确定strcmp工作正常吗?

第一个参数,即
argv[0]
包含可执行文件的名称。 因此,从数组的第二个元素开始搜索参数
argv[1]

for (cnt_1 = 1; cnt_1 < argc; cnt_1++)
//           ^  change 0 to 1 here

第一个参数,即
argv[0]
包含可执行文件的名称。 因此,从数组的第二个元素开始搜索参数
argv[1]

for (cnt_1 = 1; cnt_1 < argc; cnt_1++)
//           ^  change 0 to 1 here

您的代码中存在多个问题:

  • char s;
    应该是
    int s;
    否则((s=getchar())!=EOF)
    时的循环
    不能正常工作。根据默认情况下类型
    char
    是有符号的还是无符号的,它将在
    \377
    字符上提前停止,或者无法完全匹配
    EOF

  • input[i]=s;
    之前,不检查
    i
    是否小于
    sizeof(input)
    。任何足够长的输入文件都会导致缓冲区溢出

  • 检查此参数是否与
    NULL
    不同后,应使用
    atoi(argv[cnt_1+1])
    转换size参数

  • 如果无法使用
    strcmp()
    检查参数值或
    atoi()
    转换数字,请使用指针变量并分别检查字符:

    char *p = argv[cnt_1];
    if (p[0] == '-' && p[1] == 's' && p[2] == '\0') {
        int skip = 0;
        char *s = argv[cnt_1 + 1];
        if (s != NULL) {
            while (*s >= '0' && *s <= '9') {
                skip = skip * 10 + *s++ - '0';
            }
        }
    }
    
    char*p=argv[cnt_1];
    如果(p[0]='-'&&p[1]='s'&&p[2]=='\0'){
    int skip=0;
    char*s=argv[cnt_1+1];
    如果(s!=NULL){
    
    虽然(*s>='0'&&*s您的代码中存在多个问题:

    • char s;
      应该是
      int s;
      否则((s=getchar())!=EOF)
    时的循环
    不能正常工作。根据默认情况下类型
    char
    是有符号的还是无符号的,它将在
    \377
    字符上提前停止,或者无法完全匹配
    EOF

  • input[i]=s;
    之前,不检查
    i
    是否小于
    sizeof(input)
    。任何足够长的输入文件都会导致缓冲区溢出

  • 检查此参数是否与
    NULL
    不同后,应使用
    atoi(argv[cnt_1+1])
    转换size参数

  • 如果无法使用
    strcmp()
    检查参数值或
    atoi()
    转换数字,请使用指针变量并分别检查字符:

    char *p = argv[cnt_1];
    if (p[0] == '-' && p[1] == 's' && p[2] == '\0') {
        int skip = 0;
        char *s = argv[cnt_1 + 1];
        if (s != NULL) {
            while (*s >= '0' && *s <= '9') {
                skip = skip * 10 + *s++ - '0';
            }
        }
    }
    
    char*p=argv[cnt_1];
    如果(p[0]='-'&&p[1]='s'&&p[2]=='\0'){
    int skip=0;
    char*s=argv[cnt_1+1];
    如果(s!=NULL){
    
    当(*s>='0'&&*s我的坏消息时,我被禁止使用,因此这是我自己的strcmp,并在eq@JozefTománek你确定你的strcmp工作正常吗?@JozefTománek:不要用不同的语义重新实现标准函数,这是邪恶的
    函数,返回一个布尔值,只需测试
    if(strequal(argv[cnt_1],“-s”)){
    my bad我被禁止使用,因此这是我自己的strcmp,并在eq@JozefTománek你确定你的strcmp工作正常吗?@JozefTománek:不要用不同的语义重新实现标准函数,这是邪恶的。编写一个
    strequal()
    函数,返回一个布尔值,只需测试
    if(strequal(argv[cnt_1],“-s”){
    您在下面的评论中说“我的坏东西,我禁止使用”。因此,只需通过
    char
    比较
    argv
    字符串数组中包含的字符串来执行
    char
    。(通常情况下,编写已经包含在C标准库中的函数的您自己的版本不是一个好主意,除非它是专门指定给您这样做的。)您在下面的评论中说“我的坏,我被禁止使用”因此,只需对
    argv
    字符串数组中包含的字符串进行
    char
    比较就可以了。(通常情况下,编写C中已经包含的函数的自己版本不是一个好主意。)
    char *p = argv[cnt_1];
    if (p[0] == '-' && p[1] == 's' && p[2] == '\0') {
        int skip = 0;
        char *s = argv[cnt_1 + 1];
        if (s != NULL) {
            while (*s >= '0' && *s <= '9') {
                skip = skip * 10 + *s++ - '0';
            }
        }
    }