从标准输入创建一个以 null 结尾的字符串数组
Create an array of null-terminated strings from standard input
我正在尝试从标准输入中读取并使用 execvp()
中的输入。
目前我收到许多警告,例如
警告:赋值从指针生成整数而不进行强制转换 [-Wint-conversion] 命令[i]=NULL;
警告:传递‘execvp’的参数 1 使指针来自整数而不进行强制转换 [-Wint-conversion] execvp(commands2[0],commands2);
# 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);
}
}
首先是对指针的使用感到困惑。
char *commands
是一个指针(指向一个字符)。
commands[i]
是一个字符(不是指针)。
NULL
是一个指针(类型 void *
,值 0
)
所以,你不能写commands[i]=NULL
。
但是你可以做 commands[i]='[=17=]'
(值 0 的字符)。
那么 execvp()
所期望的向量可能存在混淆。
这个向量(execvp 的 v)是一个(一维)指针数组。
这些指针中的每一个都是一个 char *
、一个字符串、一个单词。
这个指针向量以指针 NULL 结尾。
所以,我可以提出以下简单代码(没有 fork() 和 pipe()):
#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);
}
我正在尝试从标准输入中读取并使用 execvp()
中的输入。
目前我收到许多警告,例如
警告:赋值从指针生成整数而不进行强制转换 [-Wint-conversion] 命令[i]=NULL;
警告:传递‘execvp’的参数 1 使指针来自整数而不进行强制转换 [-Wint-conversion] execvp(commands2[0],commands2);
# 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);
}
}
首先是对指针的使用感到困惑。
char *commands
是一个指针(指向一个字符)。
commands[i]
是一个字符(不是指针)。
NULL
是一个指针(类型 void *
,值 0
)
所以,你不能写commands[i]=NULL
。
但是你可以做 commands[i]='[=17=]'
(值 0 的字符)。
那么 execvp()
所期望的向量可能存在混淆。
这个向量(execvp 的 v)是一个(一维)指针数组。
这些指针中的每一个都是一个 char *
、一个字符串、一个单词。
这个指针向量以指针 NULL 结尾。
所以,我可以提出以下简单代码(没有 fork() 和 pipe()):
#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);
}