我们可以在 getopt 中添加更多选项吗?
Can we add more options in getopt?
我现在限制这段代码只是为了做一些基本的计算,比如加法和减法,以便了解 getopt
是如何工作的。
我想要实现的是:./a.out -a 20 20 -s 40 40
[结果= 40
和0
]
我是 C 的新手,所以请让我知道我的代码中的错误。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main(int argc, char *argv[]) {
FILE *file1 = fopen("Results.txt", "a");
char ch;
int res;
while ((ch = getopt(argc, argv, "a:s:")) != EOF)
switch (ch) {
case 'a':
res = add(atoi(optarg), atoi(argv[3]));
fprintf(file1, "%i\n", res);
break;
case 's':
res = subtract(atoi(optarg), atoi(argv[3]));
printf("%i \n", res);
fprintf(file1, "%i\n", res);
break;
default:
fprintf(stderr, "No such option");
return 1;
}
argc -= optind;
argv += optind;
printf("Opind = %i, argc = %i, argv = %i \n", optind, argc, argv);
fprintf(file1, "\nWritten to file\n");
fclose(file1);
return 0;
}
您的代码中存在多个问题:
您应该将 ch
定义为 int
以适应 getopt
的可能 return 值。 getopt
return 一个 int
是一个匹配的选项字符或值 -1
如果 argv
数组中没有更多选项。 char
类型在某些平台上默认是无符号的(这样做是明智的选择),因此在这些平台上 ch != EOF
将始终为真。
当没有更多选项时,getopt
的 return 值是 -1
,而不是 EOF
,后者通常被定义为 -1
但仅指定为负数。
您不检查 fopen()
是否成功,如果无法创建文件或无法以追加模式打开文件进行写入,则会产生未定义的行为。
您没有检查 -a
和 -s
选项是否有足够的参数。
add
和 subtract
的第二个参数总是 argv[3]
。它应该是argv
数组中的下一个参数,argv[optind]
,你应该在使用后跳过它。
对于 %i
转换说明符,argv
无法传递给 printf
。目前还不清楚你打算这样做。
这是修改后的版本:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main(int argc, char *argv[]) {
FILE *file1 = fopen("Results.txt", "a");
int ch, res;
if (file1 == NULL) {
fprintf(stderr, "cannot open Results.txt for appending: %s\n",
strerror(errno));
return 1;
}
while ((ch = getopt(argc, argv, "a:s:")) != -1) {
switch (ch) {
case 'a':
if (optind >= argc) {
fprintf(stderr, "not enough arguments\n");
return 1;
}
res = add(atoi(optarg), atoi(argv[optind]));
optind++;
//printf("%i\n", res);
fprintf(file1, "%i\n", res);
break;
case 's':
if (optind >= argc) {
fprintf(stderr, "not enough arguments\n");
return 1;
}
res = subtract(atoi(optarg), atoi(argv[optind]));
optind++;
//printf("%i\n", res);
fprintf(file1, "%i\n", res);
break;
default:
fprintf(stderr, "No such option");
return 1;
}
}
argc -= optind;
argv += optind;
printf("Opind = %i, argc = %i\n", optind, argc);
fprintf(file1, "\nWritten to file\n");
fclose(file1);
return 0;
}
我现在限制这段代码只是为了做一些基本的计算,比如加法和减法,以便了解 getopt
是如何工作的。
我想要实现的是:./a.out -a 20 20 -s 40 40
[结果= 40
和0
]
我是 C 的新手,所以请让我知道我的代码中的错误。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main(int argc, char *argv[]) {
FILE *file1 = fopen("Results.txt", "a");
char ch;
int res;
while ((ch = getopt(argc, argv, "a:s:")) != EOF)
switch (ch) {
case 'a':
res = add(atoi(optarg), atoi(argv[3]));
fprintf(file1, "%i\n", res);
break;
case 's':
res = subtract(atoi(optarg), atoi(argv[3]));
printf("%i \n", res);
fprintf(file1, "%i\n", res);
break;
default:
fprintf(stderr, "No such option");
return 1;
}
argc -= optind;
argv += optind;
printf("Opind = %i, argc = %i, argv = %i \n", optind, argc, argv);
fprintf(file1, "\nWritten to file\n");
fclose(file1);
return 0;
}
您的代码中存在多个问题:
您应该将
ch
定义为int
以适应getopt
的可能 return 值。getopt
return 一个int
是一个匹配的选项字符或值-1
如果argv
数组中没有更多选项。char
类型在某些平台上默认是无符号的(这样做是明智的选择),因此在这些平台上ch != EOF
将始终为真。当没有更多选项时,
getopt
的 return 值是-1
,而不是EOF
,后者通常被定义为-1
但仅指定为负数。您不检查
fopen()
是否成功,如果无法创建文件或无法以追加模式打开文件进行写入,则会产生未定义的行为。您没有检查
-a
和-s
选项是否有足够的参数。add
和subtract
的第二个参数总是argv[3]
。它应该是argv
数组中的下一个参数,argv[optind]
,你应该在使用后跳过它。
对于 argv
无法传递给printf
。目前还不清楚你打算这样做。
%i
转换说明符,这是修改后的版本:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main(int argc, char *argv[]) {
FILE *file1 = fopen("Results.txt", "a");
int ch, res;
if (file1 == NULL) {
fprintf(stderr, "cannot open Results.txt for appending: %s\n",
strerror(errno));
return 1;
}
while ((ch = getopt(argc, argv, "a:s:")) != -1) {
switch (ch) {
case 'a':
if (optind >= argc) {
fprintf(stderr, "not enough arguments\n");
return 1;
}
res = add(atoi(optarg), atoi(argv[optind]));
optind++;
//printf("%i\n", res);
fprintf(file1, "%i\n", res);
break;
case 's':
if (optind >= argc) {
fprintf(stderr, "not enough arguments\n");
return 1;
}
res = subtract(atoi(optarg), atoi(argv[optind]));
optind++;
//printf("%i\n", res);
fprintf(file1, "%i\n", res);
break;
default:
fprintf(stderr, "No such option");
return 1;
}
}
argc -= optind;
argv += optind;
printf("Opind = %i, argc = %i\n", optind, argc);
fprintf(file1, "\nWritten to file\n");
fclose(file1);
return 0;
}