C 从标准输入创建以null结尾的字符串数组
我正在尝试从标准输入读入并使用C 从标准输入创建以null结尾的字符串数组,c,exec,execvp,C,Exec,Execvp,我正在尝试从标准输入读入并使用execvp()中的输入 目前我收到许多警告,例如 警告:赋值使指针中的整数不带强制转换[-Wint conversion]命令[i]=NULL 警告:传递'execvp'的参数1会从整数生成指针,而不使用强制转换[-Wint conversion]execvp(commands2[0],commands2) #包括 #包括 #包括 #包括 #包括 #定义BUF_大小256 int main() { 字符缓冲区[BUF_大小]; char*命令; 字符*命令2; f
execvp()
中的输入
目前我收到许多警告,例如
警告:赋值使指针中的整数不带强制转换[-Wint conversion]命令[i]=NULL
警告:传递'execvp'的参数1会从整数生成指针,而不使用强制转换[-Wint conversion]execvp(commands2[0],commands2)
#包括
#包括
#包括
#包括
#包括
#定义BUF_大小256
int main()
{
字符缓冲区[BUF_大小];
char*命令;
字符*命令2;
fgets(缓冲区、BUF_尺寸、标准尺寸);
commands=strtok(缓冲区“”);
printf(“%d”,命令[0]);
while(命令!=NULL)
{
printf(“%s”,命令);
commands=strtok(NULL,“”);
}
命令=realloc(命令,1);
int i=strlen(命令);
printf(“%d”,i);
命令[i]=NULL;
fgets(缓冲区、BUF_尺寸、标准尺寸);
commands2=strtok(缓冲区“”);
while(commands2!=NULL)
{
commands2=strtok(NULL,“”);
}
commands2=realloc(commands2,1);
intz=strlen(commands2);
printf(“%d”,z);
commands2[z]=NULL;
int my_管道[2];
如果(管道(我的管道)=-1)
{
perror(“无法创建管道”);
}
pid\u t我的pid;
my_pid=fork();
如果(我的pid<0)
{
perror(“失败的fork\n”);
}
如果(我的pid>0)
{
关闭(my_管道[1]);
dup2(my_管道[0],0);
关闭(my_管道[0]);
等待(空);
execvp(commands2[0],commands2);
}
其他的
{
关闭(my_管道[0]);
dup2(my_管道[1],1);
关闭(my_管道[1]);
execvp(命令[0],命令);
}
}
首先是关于使用指针的混淆。
char*命令
是一个指针(指向字符)。
命令[i]
是字符(不是指针)。
NULL
是指针(类型为void*
,值为0
)
因此,您不能编写命令[i]=NULL
。
但是您可以执行命令[i]='\0'
(值为0的字符)
然后可能会混淆execvp()
所期望的向量。
这个向量(execvp的v)是一个指针数组(一维)。
这些指针中的每一个都是一个字符*
、一个字符串和一个单词。
指针向量以指针NULL结尾
因此,我可以提出以下简单代码(没有fork()和pipe()):
#包括
#包括
#包括
#包括
#定义BUF_大小256
#定义最大参数256
int main(){
字符缓冲区[BUF_大小];
字符*argv[MAX_ARGS];
int argc=0;
fgets(缓冲区、BUF_尺寸、标准尺寸);
对于(argv[argc]=strtok(缓冲区“\t\n”);
argv[argc]!=NULL;
argv[++argc]=strtok(空,“\t\n”)){
printf(“argv[%d]=\%s\“\n”,argc,argv[argc]);
}
argv[argc]=NULL;
execvp(argv[0],argv);
perror(argv[0]);
退出(退出失败);
}
fgets
可以。然后,您可以使用诸如malloc
和/或realloc
、strtok
和strcpy
之类的函数。那么,您的意思是对缓冲区中的输入进行标记化并将null添加到末尾吗?这是一种方法。。。只要搜索一下,你就会发现很多例子。。。快乐编码顺便说一句:strlen
也将是handyOkay,假设我将缓冲区标记化并将其放入char*token
中。如何将NULL添加到令牌的末尾?你能帮我解决这个问题吗?我想上次我试这个的时候,我被卡在这一点上了。现在,你可以为你自己的代码获取帮助/答案,但我们不为你编写代码。因此,请尽最大努力编写代码,标记缓冲区,当/如果遇到问题,发布代码,描述问题,很可能有人会帮助您。
# include <stdlib.h>
# include <stdio.h>
# include <unistd.h>
# include <string.h>
# include <sys/wait.h>
# define BUF_SIZE 256
int main()
{
char buffer[BUF_SIZE];
char *commands;
char *commands2;
fgets(buffer, BUF_SIZE, stdin);
commands = strtok(buffer, " ");
printf("%d",commands[0]);
while( commands != NULL )
{
printf( "%s", commands );
commands = strtok(NULL, " ");
}
commands = realloc(commands,1);
int i = strlen(commands);
printf("%d",i);
commands[i]=NULL;
fgets(buffer, BUF_SIZE, stdin);
commands2 = strtok(buffer, " ");
while( commands2 != NULL )
{
commands2 = strtok(NULL, " ");
}
commands2 = realloc(commands2,1);
int z = strlen(commands2);
printf("%d",z);
commands2[z]=NULL;
int my_pipe[2];
if (pipe(my_pipe) == -1)
{
perror("cannot create pipe\n");
}
pid_t my_pid;
my_pid = fork();
if (my_pid < 0)
{
perror("Failed fork\n");
}
if (my_pid > 0)
{
close(my_pipe[1]);
dup2(my_pipe[0], 0);
close(my_pipe[0]);
wait(NULL);
execvp(commands2[0],commands2);
}
else
{
close(my_pipe[0]);
dup2(my_pipe[1], 1);
close(my_pipe[1]);
execvp(commands[0],commands);
}
}
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define BUF_SIZE 256
#define MAX_ARGS 256
int main() {
char buffer[BUF_SIZE];
char *argv[MAX_ARGS];
int argc = 0;
fgets(buffer, BUF_SIZE, stdin);
for ( argv[argc] = strtok(buffer, " \t\n");
argv[argc] != NULL;
argv[++argc] = strtok(NULL, " \t\n") ) {
printf("argv[%d]=\"%s\"\n", argc, argv[argc]);
}
argv[argc] = NULL;
execvp(argv[0], argv);
perror(argv[0]);
exit(EXIT_FAILURE);
}