在 C 中编程以读取参数
Program in C to read arguments
我开始学习 C,我想创建一个程序,该程序将采用 2 个强制参数和 1 个可选参数。 `
这个问题听起来很初级,但我很难理解。
所以基本上我想做的是这样调用程序:
myfile -n name -a age -g grade
所以当我调用它时,这将是有效的:myfile john 22 20
Name
和 age
是 obligatory
。所以 name
是一个字符串, age
是一个介于 0 和 100 之间的数字。
而 grade
是 optional
并且可以是一个数字。如果未定义,则其值为 0。
我试过这样做:
int main(int argc, char **argv){
FILE *fp;
char *filename = "student.txt";
char name;
int age, grade;
if( (fp = fopen(filename, "w")) == NULL) {
// show error
printf("Error.");
}
if(argc!=2)
{
printf("Error.");
return;
}
int ich = 0;
while ((ich = getopt (argc, argv, "abc")) != -1) {
switch (ich) {
case 'a':
name = argv[1];
break;
case 'b':
age = argv[2];
if not (age >= 0 && age<100) {
printf("Error.");
}
break;
case 'c':
grade = argv[3];
if (grade == NULL) {
grade = 0;
}
break;
default:
break;
}
}
我想使用指针 optarg
来访问参数。
我收到此错误 warning: assignment makes integer from pointer without a cast [-Wint-conversion]
我真的需要帮助。拜托,有人可以帮助我吗?我真的需要帮助。 :(
经过讨论等,我根据问题中的代码创建了这段代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
static char *arg0 = 0;
static void usage(void)
{
fprintf(stderr, "Usage: %s -n name -a age [-g grade]\n", arg0);
exit(EXIT_FAILURE);
}
int main(int argc, char **argv)
{
FILE *fp;
char *filename = "student.txt";
char *name = 0;
int age = 0;
int grade = 22;
arg0 = argv[0];
int opt;
while ((opt = getopt(argc, argv, "n:a:g:")) != -1)
{
switch (opt)
{
case 'n':
name = optarg;
break;
case 'a':
age = atoi(optarg);
if (age <= 0 || age >= 100)
{
fprintf(stderr, "Age '%s' out of range 1..99\n", optarg);
usage();
}
break;
case 'g':
grade = atoi(optarg);
break;
default:
break;
}
}
if (name == 0)
{
fprintf(stderr, "You did not specify a name\n");
usage();
}
if (age == 0)
{
fprintf(stderr, "You did not specify an age\n");
usage();
}
if (optind != argc)
{
fprintf(stderr, "Extra arguments provided (starting with '%s')\n", argv[optind]);
usage();
}
// check if file exists
if ((fp = fopen(filename, "w")) != NULL)
{
printf("%s, %d, %d\n", name, age, grade);
fprintf(fp, "%s, %d, %d\n", name, age, grade);
fclose(fp);
}
else
{
fprintf(stderr, "Failed to open file '%s' for writing\n", filename);
return 1;
}
return 0;
}
示例运行
程序名称:go59
$ go59
You did not specify a name
Usage: go59 -n name -a age [-g grade]
$ go59 -n Rita
You did not specify an age
Usage: go59 -n name -a age [-g grade]
$ go59 -n Rita -a 23
Rita, 23, 22
$ go59 -n Andromeda -a 23 -g 97
Andromeda, 23, 97
$ go59 -n Andromeda -a 23 -g 97 apoplexy
Extra arguments provided (starting with 'apoplexy')
Usage: go59 -n name -a age [-g grade]
$ go59 -n Andromeda -a 23 -g 97 --
Andromeda, 23, 97
$ go59 -n Andromeda -a -1 -g 97 --
Age '-1' out of range 1..99
Usage: go59 -n name -a age [-g grade]
$ go59 -n Andromeda -a 0 -g 97 --
Age '0' out of range 1..99
Usage: go59 -n name -a age [-g grade]
$
请注意,在知道所提供的参数足够有效之前,代码不会删除 student.txt
文件。
欢迎来到C。关于C最重要的理念是不要重新发明轮子。您正在寻找的参数样式是 GNU 标准。也就是说,GNU 已经编写了所有 C 代码来为您完成这项工作(就解析 argc 和 argv 而言)。查看 GNU 的 getopt 共享库。如果您在 Linux,那么您已经拥有它了。
我开始学习 C,我想创建一个程序,该程序将采用 2 个强制参数和 1 个可选参数。 ` 这个问题听起来很初级,但我很难理解。 所以基本上我想做的是这样调用程序:
myfile -n name -a age -g grade
所以当我调用它时,这将是有效的:myfile john 22 20
Name
和 age
是 obligatory
。所以 name
是一个字符串, age
是一个介于 0 和 100 之间的数字。
而 grade
是 optional
并且可以是一个数字。如果未定义,则其值为 0。
我试过这样做:
int main(int argc, char **argv){
FILE *fp;
char *filename = "student.txt";
char name;
int age, grade;
if( (fp = fopen(filename, "w")) == NULL) {
// show error
printf("Error.");
}
if(argc!=2)
{
printf("Error.");
return;
}
int ich = 0;
while ((ich = getopt (argc, argv, "abc")) != -1) {
switch (ich) {
case 'a':
name = argv[1];
break;
case 'b':
age = argv[2];
if not (age >= 0 && age<100) {
printf("Error.");
}
break;
case 'c':
grade = argv[3];
if (grade == NULL) {
grade = 0;
}
break;
default:
break;
}
}
我想使用指针 optarg
来访问参数。
我收到此错误 warning: assignment makes integer from pointer without a cast [-Wint-conversion]
我真的需要帮助。拜托,有人可以帮助我吗?我真的需要帮助。 :(
经过讨论等,我根据问题中的代码创建了这段代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
static char *arg0 = 0;
static void usage(void)
{
fprintf(stderr, "Usage: %s -n name -a age [-g grade]\n", arg0);
exit(EXIT_FAILURE);
}
int main(int argc, char **argv)
{
FILE *fp;
char *filename = "student.txt";
char *name = 0;
int age = 0;
int grade = 22;
arg0 = argv[0];
int opt;
while ((opt = getopt(argc, argv, "n:a:g:")) != -1)
{
switch (opt)
{
case 'n':
name = optarg;
break;
case 'a':
age = atoi(optarg);
if (age <= 0 || age >= 100)
{
fprintf(stderr, "Age '%s' out of range 1..99\n", optarg);
usage();
}
break;
case 'g':
grade = atoi(optarg);
break;
default:
break;
}
}
if (name == 0)
{
fprintf(stderr, "You did not specify a name\n");
usage();
}
if (age == 0)
{
fprintf(stderr, "You did not specify an age\n");
usage();
}
if (optind != argc)
{
fprintf(stderr, "Extra arguments provided (starting with '%s')\n", argv[optind]);
usage();
}
// check if file exists
if ((fp = fopen(filename, "w")) != NULL)
{
printf("%s, %d, %d\n", name, age, grade);
fprintf(fp, "%s, %d, %d\n", name, age, grade);
fclose(fp);
}
else
{
fprintf(stderr, "Failed to open file '%s' for writing\n", filename);
return 1;
}
return 0;
}
示例运行
程序名称:go59
$ go59
You did not specify a name
Usage: go59 -n name -a age [-g grade]
$ go59 -n Rita
You did not specify an age
Usage: go59 -n name -a age [-g grade]
$ go59 -n Rita -a 23
Rita, 23, 22
$ go59 -n Andromeda -a 23 -g 97
Andromeda, 23, 97
$ go59 -n Andromeda -a 23 -g 97 apoplexy
Extra arguments provided (starting with 'apoplexy')
Usage: go59 -n name -a age [-g grade]
$ go59 -n Andromeda -a 23 -g 97 --
Andromeda, 23, 97
$ go59 -n Andromeda -a -1 -g 97 --
Age '-1' out of range 1..99
Usage: go59 -n name -a age [-g grade]
$ go59 -n Andromeda -a 0 -g 97 --
Age '0' out of range 1..99
Usage: go59 -n name -a age [-g grade]
$
请注意,在知道所提供的参数足够有效之前,代码不会删除 student.txt
文件。
欢迎来到C。关于C最重要的理念是不要重新发明轮子。您正在寻找的参数样式是 GNU 标准。也就是说,GNU 已经编写了所有 C 代码来为您完成这项工作(就解析 argc 和 argv 而言)。查看 GNU 的 getopt 共享库。如果您在 Linux,那么您已经拥有它了。