字符串输入不准确

  • 本文关键字:不准确 字符串 c
  • 更新时间 :
  • 英文 :

#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_LINE 1024
void run_shell(char * cmd){
char * str = cmd;
int size = strlen(str);
char blank[] = " ";
char * token = strtok(str, blank);
char * argv[3];
int i = 0;
while(token != NULL){
argv[i] = token;
i++;
token = strtok(NULL, blank);
}
argv[i] = NULL;
pid_t pid;
if((pid = fork()) == 0){
if(execvp(argv[0], argv) < 0){
perror("Invalid Command!n");
exit(0);
}
}
else{
if(waitpid(pid, NULL, 0) < 0){
perror("Some Problem Program!n");
exit(0);
}
}
printf("n");
}
int main(){
char comand[MAX_LINE];
char * username;
printf("Eter your name : ");
scanf("%s", username);
while(1){
char cwd[MAX_LINE];
getcwd(cwd, sizeof(cwd));
printf("%s %s$ > ", username, cwd);
fgets(comand, MAX_LINE, stdin);
printf("n");
run_shell(comand);
}
}

我在做一个小贝壳。但是当我输入一个命令时,execvp函数会导致一个错误。当我打印出argv[]时,我可以看到它已经标记化了,没有任何问题。很难猜测我的代码内部的移动,因为我对标准输入/输出了解不多。怎么了?我应该修复什么?

您的程序至少有三个问题:

  • char * username;不会初始化username以指向任何内容,因此在执行scanf("%s", username);时未初始化。对于初学者级别的程序,可以将username定义为char username[1024];
  • scanf("%s", username);中,用户键入一些字符,然后按回车/回车键,这会将一个换行符放入流中。CCD_ 7读取非空白字符并将新行字符留在流中。然后,后面的fgets读取该新行字符,导致除该字符外的一行为空
  • fgets(comand, MAX_LINE, stdin);中,fgets进行读取,直到找到新的行字符(或缓冲区已满(。它将换行符留在缓冲区的末尾。你应该删除它

请注意,这些都不是execvp的问题,这表明标题"execvp函数不能完全工作"是错误的。调试程序时,请仔细分析各个部分。不要认为出现故障的步骤就是导致故障的步骤。检查程序中各个点的对象(变量(的值,以确保从开始到结束的步骤都按要求进行。检查字符串时,请注意"不可见"字符。

最新更新