所以我很难理解和让我的代码工作。
我有那个代码:
int main(int argc, char *argv[])
{
while(1){
// Buffer containing one sample (left and right, both 16 bit).
int16_t samples[2];
unsigned cbBuffer=sizeof(samples); // size in bytes of
// Read one sample from input
int got=read(STDIN_FILENO, samples, cbBuffer);
if(got<0){
fprintf(stderr, "%s: Read from stdin failed, error=%s.", argv[0], strerror(errno));
exit(1);
}else if(got==0){
break; // end of file
}else if(got!=cbBuffer){
fprintf(stderr, "%s: Did not receive expected number of bytes.n", argv[0]);
exit(1);
}
// Copy one sample to output
int done=write(STDOUT_FILENO, samples, cbBuffer);
if(done<0){
fprintf(stderr, "%s: Write to stdout failed, error=%s.", argv[0], strerror(errno));
exit(1);
}else if(done!=cbBuffer){
fprintf(stderr, "%s: Could not read requested number of bytes from stream.n", argv[0]);
}
}
return 0;
}
我在终端上打电话
:./mp3_file_src.sh bn9th_m4.mp3 | ./passthrough > /dev/null
我想修改代码,以便他可以获取数字 n 并处理 n 个样本(所以我在我的代码中得到samples[2*n]
)。如果没有为可执行文件提供任何参数,则使用默认值。
如果我理解正确,我可以验证是否给出了参数,如果argc>2
?但是我似乎无法理解如何获得该参数并将其传递到我的代码中。
知道吗?
只需通过argv[1]
访问它。如果是数字参数,则需要将其从字符串转换为数字,例如:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int default_opt = 5, option = 0;
if ( argc < 2 ) {
printf("You didn't supply an argument, using default.n");
option = default_opt;
} else {
char * endptr;
option = strtol(argv[1], &endptr, 10);
if ( *endptr ) {
printf("You supplied an invalid argument, exiting.n");
exit(EXIT_FAILURE);
}
}
printf("Option set to %d.n", option);
return EXIT_SUCCESS;
}
输出:
paul@MacBook:~/Documents/src/scratch$ ./arg
You didn't supply an argument, using default.
Option set to 5.
paul@MacBook:~/Documents/src/scratch$ ./arg 7
Option set to 7.
paul@MacBook:~/Documents/src/scratch$ ./arg whut
You supplied an invalid argument, exiting.
paul@MacBook:~/Documents/src/scratch$
argc
是argv
中的元素数,其中包含提供给程序的参数。argv
(argv[0]
)的第一个元素是可执行文件名,所以argc
总是至少为1。因此,您检查是否argc > 2
以查看是否给出了任何参数。
请注意,参数始终是字符串,因此要从中提取数字,您需要使用 strtol
或类似内容。