我使用sscanf读取用户输入并保存到几个输出。就我的理解而言,如果我有sscanf(input, %s %s %s %s %s, arr[0], arr[1], arr[2], arr[3]),我最多可以输入4个项目,但它不需要4;也就是说我可以把2和arr[2]放在一起,而arr[3]没有值。然而,我认为我不理解的东西,因为后来当我检查arr[2]/arr[3]的值,他们不是null,当我认为字符串只是用 初始化。请看看我的代码,告诉我if语句应该检查什么。
printf("Enter a command: ");
char input[20];
char line[5][20];
fgets(input, 20, stdin);
sscanf(input, "%s %s %s %s %s", line[0], line[1], line[2], line[3], line[4]);
....
else {
int status;
if(line[4] != NULL) {
char *args[6];
args[0] = line[0];
args[1] = line[1];
args[2] = line[2];
args[3] = line[3];
args[4] = line[4];
args[5] = NULL;
if ( fork() == 0 ) {
execv( args[0], args ); // child: call execv with the path and the args
}
else {
wait( &status );
}
使用Jerry Jeremiah所说的注释,我将if语句中的[x]行更改为指针并检查是否为NULL,而不是将声明更改为指针。
scanf
将尝试得到您所要求的一切。你要5个,它就试着得到5个
sscanf(input, "%19s %19s %19s %19s %19s", line[0], line[1], line[2], line[3], line[4]);
如果没有规范,它将占用用户倾向于提交的所有字符,从而导致缓冲区溢出。坏主意。
我会一次接受一个参数,或者把所有的参数作为一个整体。