我想从命令行获取输入,(n)但我的代码只是编写这个进度条。我无法弄清楚如何打印像Enter a value
之类的语句,然后获取该值并使用它运行程序。我试过把它放到很多不同的地方。有什么建议?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
int main(int argc, char *argv[]) {
//Check command line
if (argc != 2) {
printf("Usage: progress n\n");
return 1;
}
int n = atoi(argv[1]);
time_t c = atoi(argv[1]);
int go = atoi(argv[1]);
if (argc == 2) {
//sscanf(argv[1], "%d", &n);
time(&c);
n = 10;
go = n + c;
char display[70];
char equals[70];
char disp[70];
for (int i = 0; i <= go * n; i++) {
strcpy(display, "progress: |");
strcat(equals, "=");
strcpy(disp, "|");
char number[70];
char space[70];
sscanf(argv[1], "%d", &n);
sprintf(number, " %d%%", i * 2);
sprintf(space, "%-52s", equals); // this keeps the 2nd bar static
strcat(display, space);
strcat(display, disp);
strcat(display, number);
//This is the final output
fprintf(stderr, "\r%s %d \r%s", equals, i, display);
usleep(1000000);
}
}
return 0;
}
答案 0 :(得分:0)
要将表示数字的命令行参数字符串argv[1]
转换为int n
,您可以使用以下任何一种:
n = atoi(argv[1]);
这个对于基数为10的数字很简单。
n = strtol(argv[1], NULL, 10);
这个可以用来解析后缀或检查参数是否真的是一个数字。它可以支持其他基础或八进制和十六进制语法。
n = 0; sscanf(argv[1], "%d", &n);
此方法也可以使用,但必须初始化n
或必须检查sscanf
返回值以避免非数字字符串参数的未定义行为。
这些方法在处理非数值和超出范围值方面存在微妙差异。
您可以将atoi()
用于您的目的。
如果您的程序应该使用3个命令行参数,则必须在命令行上传递它们。要运行该程序,请打开CMD.EXE
上的Windows
终端或linux
上的终端窗口,将当前目录更改为可执行文件的目录并键入:
C:\Project\Myproject> Myproject 123 456 789
或者在Linux或Mac / OS上:
user@mylaptop:~/projects/myproject > ./myproject 123 456 789
在main
函数的开头,检查命令行参数的最小数量:
if (argc < 3 + 2) {
printf("missing arguments: expected n c and go\n");
return 1;
}
并将每个参数转换为相应的变量:
int n = atoi(argv[1]); // first argument is the value of n
time_t c = atoi(argv[2]); // second argument is the value of c
int go = atoi(argv[3]); // third argument is the value of go