通过 argv 传递的参数影响程序的输出
Arguments passed through argv impact the output of the program
这是作业
因此,对于我的项目,我必须将两个字符串合并到一起,其中两个字符串在合并时都有一个模式。 (这很模糊,所以我在下面举了一个例子。我的问题是我的主要函数中的 argv 参数。Argv 在程序 运行 时读取用户的输入。所以它就像./program_name -r。程序这部分的 -r 会成功,所以下面显示的示例将在用户输入后 运行 通过。但是我遇到的问题是,如果我有任何其他像 -d 这样的字母,然后程序仍然 运行s 通过。这不是问题,但我程序的另一部分要求我有一个不同的 运行 代码,所以程序会做一些不同的事情。我假设我的问题在我的 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 != '[=10=]' && *s2 != '[=10=]')
{
*output++ = *s1++;
*output++ = *s2++;
}
while (*s1 != '[=10=]')
*output++ = *s1++;
while (*s2 != '[=10=]')
*output++ = *s2++;
*output='[=10=]';
}
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; }
- 我没有初始化
- argv[i] = "-r" <- 是赋值语句,应该用"=="
您在 main 函数中尝试做的是检查第一个命令行参数是否等于“-r”。
您实际做的是使用单个“=”将“-r”分配给 argv[i]。
在 C 中,比较是通过“==”运算符完成的。
但是,由于您正在尝试与字符串(在 C 中是字符数组)进行比较,因此您不能为此目的使用“==”,因为您只会比较字符数组开始的地址.
为此使用 C 库函数 strcmp:
https://www.tutorialspoint.com/c_standard_library/c_function_strcmp.htm
您也没有像 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;
}
如果您这样做(使用 switch
),您可以轻松添加更多单字母选项,而不会弄乱您的代码。把它放在一个循环中,你可以一次给程序更多的选择。
这是作业
因此,对于我的项目,我必须将两个字符串合并到一起,其中两个字符串在合并时都有一个模式。 (这很模糊,所以我在下面举了一个例子。我的问题是我的主要函数中的 argv 参数。Argv 在程序 运行 时读取用户的输入。所以它就像./program_name -r。程序这部分的 -r 会成功,所以下面显示的示例将在用户输入后 运行 通过。但是我遇到的问题是,如果我有任何其他像 -d 这样的字母,然后程序仍然 运行s 通过。这不是问题,但我程序的另一部分要求我有一个不同的 运行 代码,所以程序会做一些不同的事情。我假设我的问题在我的 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 != '[=10=]' && *s2 != '[=10=]')
{
*output++ = *s1++;
*output++ = *s2++;
}
while (*s1 != '[=10=]')
*output++ = *s1++;
while (*s2 != '[=10=]')
*output++ = *s2++;
*output='[=10=]';
}
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; }
- 我没有初始化
- argv[i] = "-r" <- 是赋值语句,应该用"=="
您在 main 函数中尝试做的是检查第一个命令行参数是否等于“-r”。
您实际做的是使用单个“=”将“-r”分配给 argv[i]。 在 C 中,比较是通过“==”运算符完成的。
但是,由于您正在尝试与字符串(在 C 中是字符数组)进行比较,因此您不能为此目的使用“==”,因为您只会比较字符数组开始的地址.
为此使用 C 库函数 strcmp:
https://www.tutorialspoint.com/c_standard_library/c_function_strcmp.htm
您也没有像 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;
}
如果您这样做(使用 switch
),您可以轻松添加更多单字母选项,而不会弄乱您的代码。把它放在一个循环中,你可以一次给程序更多的选择。