Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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_String_Argv - Fatal编程技术网

C 通过argv传递的参数会影响程序的输出

C 通过argv传递的参数会影响程序的输出,c,string,argv,C,String,Argv,这是家庭作业 因此,对于我的项目,我必须将两个字符串组合在一个数组中,在组合时,两个字符串都有一个模式。(这很模糊,所以我在下面举一个例子。我的问题是我的主函数中的argv参数。argv在运行程序时读取用户的输入。因此它类似于./program_name-r。程序这部分的-r将使下面所示的示例在用户输入后运行。但是我遇到的问题是,如果我有任何其他字母,比如-d,那么程序仍然可以运行。这不是问题,但我程序的另一部分要求我有不同的运行代码,以便程序可以执行不同的操作。我假设我的问题在我的if语句中,

这是家庭作业

因此,对于我的项目,我必须将两个字符串组合在一个数组中,在组合时,两个字符串都有一个模式。(这很模糊,所以我在下面举一个例子。我的问题是我的主函数中的argv参数。argv在运行程序时读取用户的输入。因此它类似于./program_name-r。程序这部分的-r将使下面所示的示例在用户输入后运行。但是我遇到的问题是,如果我有任何其他字母,比如-d,那么程序仍然可以运行。这不是问题,但我程序的另一部分要求我有不同的运行代码,以便程序可以执行不同的操作。我假设我的问题在我的if语句中,但我不知道为什么它不起作用。任何帮助都将非常感谢艾德


输入:字符串1:abc

字符串2:123

输出:a1b2c3


这是我的程序,它符合并给出正确的输出

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

void merge(char *s1, char *s2, char *output)
{
while (*s1 != '\0' && *s2 != '\0')
{
    *output++ = *s1++;
*output++ = *s2++;
}
while (*s1 != '\0')
    *output++ = *s1++;
while (*s2 != '\0')
    *output++ = *s2++;
*output='\0';
}

int main(int argc , char *argv[])
{
 int i;
if(argv[i] = "-r") {

char string1[30]; 
char string2[30];
 
 printf("Please enter a string of maximum 30 characters: ");
  scanf("%s" ,string1);
 printf("Please enter a string of maximum 30 characters: ");
  scanf("%s" ,string2);

char *output=malloc(strlen(string1)+strlen(string2)+1); 
//allocate memory for both strings+1 for null
merge(string1,string2,output); 
printf("%s\n",output); }
 
 return 0; }
  
#包括
#包括
#包括
无效合并(char*s1、char*s2、char*output)
{
而(*s1!='\0'&&&*s2!='\0')
{
*输出+++=*s1++;
*输出+++=*s2++;
}
而(*s1!='\0')
*输出+++=*s1++;
而(*s2!='\0')
*输出+++=*s2++;
*输出='\0';
}
int main(int argc,char*argv[])
{
int i;
如果(argv[i]=“-r”){
charstring1[30];
charstring2[30];
printf(“请输入最多30个字符的字符串:”;
scanf(“%s”,string1);
printf(“请输入最多30个字符的字符串:”;
scanf(“%s”,string2);
char*output=malloc(strlen(string1)+strlen(string2)+1);
//为两个字符串分配内存+1表示null
合并(字符串1、字符串2、输出);
printf(“%s\n”,输出);}
返回0;}
  • 我没有初始化

  • argv[i]=“-r”您在主函数中尝试做的是检查第一个命令行参数是否等于“-r”

    实际上,您所做的是使用单个“=”将“-r”赋值给argv[i]。 在C语言中,通过“==”操作符进行比较

    但是,由于您试图与字符串(C中的字符数组)进行比较,因此不能使用“==”,因为您只会比较字符数组开始的地址

    为此,请改用C库函数strcmp:


    正如Ora已经指出的那样,您还没有初始化变量i。

    C8263A20已经回答了您的错误,但是比较字符串并不是这样做的

    注意:解析命令行选项是一项相当复杂的任务,如果可能,您应该使用现成的解决方案,例如:
    getopt(3)
    (在Posix中)

    对于您当前的问题,一个简短(过度)简化的解决方案是:

    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
    
      // check: do we have one option given at all?
      if (argc == 2) {
        // first character is a hyphen, so skip it
        // A good idea would be to check if the assumption above is correct
        switch (argv[1][1]) {
          // we can only "switch" integers, so use single quotes
          case 'r':
            puts("Option \"r\" given");
            break;
          case 'd':
            puts("Option \"d\" given");
            break;
          default:
            printf("Unknown option %c given\n", argv[1][1]);
            break;
        }
      } else {
        puts("No options given at all");
      }
    
      return 0;
    }
    
    #包括
    int main(int argc,char*argv[])
    {
    //检查:我们是否有一个选项?
    如果(argc==2){
    //第一个字符是连字符,请跳过它
    //一个好办法是检查上述假设是否正确
    开关(argv[1][1]){
    //我们只能“切换”整数,所以使用单引号
    案例“r”:
    看跌期权(“期权\”r \“给定”);
    打破
    案例“d”:
    看跌期权(“期权”d“给定”);
    打破
    违约:
    printf(“给定未知选项%c\n”,argv[1][1]);
    打破
    }
    }否则{
    看跌期权(“完全没有期权”);
    }
    返回0;
    }
    

    如果这样做(使用
    开关
    ),您可以轻松添加更多单字母选项,而不会使代码混乱。将其放入循环中,您可以一次为程序提供更多选项。

    我尝试过,但当我有==时,它只会退出程序,因为我没有初始化,所以argv[I]指向完全随机的地方。你想检查argv[1]很抱歉,我也将I初始化为整数值,忘了在我的注释中包含该值。我正在考虑为该程序使用switch语句,但我不确定该如何操作。这帮了大忙。谢谢!