char* argv[MAXARGS];
char* buf2=malloc(MAXLINE * sizeof(char));
strcpy(buf2, buf); //buf is string with some words
char* ptr = strtok(buf2, " ");
argv[0]=ptr;
strcpy(argv[0], ptr);
free(buf2);
像上面一樣,我想復制 to 的值,ptr但argv[0]我不能strcpy(argv[0],ptr)直接使用,因為訪問argv[0]沒有argv[0]=ptr導致分段錯誤。所以我做了上面的代碼,但是在我 free 之后buf2,它argv[0]變成了 null。不提前使用怎么復制ptr到?argv=ptr
代碼:
#define MAXARGS 128
#define MAXLINE 256
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
void eval(char* cmdline);
int parseline(char* buf, char** argv);
int main()
{
char cmdline[MAXLINE]; /* Command line */
char* ret;
while (1) {
/* Read */
printf("mini> ");
ret = fgets(cmdline, MAXLINE, stdin);
if (feof(stdin) || ret == NULL)
exit(0);
/* Evaluate */
eval(cmdline);
}
}
void eval(char* cmdline)
{
char** argv=malloc(MAXARGS*sizeof(char)); /* Argument list execve() */
char buf[MAXLINE]; /* Holds modified command line */
int bg; /* Should the job run in bg or fg? */
pid_t pid; /* Process id */
strcpy(buf, cmdline);
bg = parseline(buf, argv);
free(argv);
}
int parseline(char* buf, char** argv)
{
int argc; /* Number of args */
int bg; /* Background job? */
char* buf2=malloc(MAXLINE * sizeof(char));
while (*buf && (*buf == ' '))
buf ;
buf[strlen(buf) - 1] = ' ';/* Replace trailing '\n' with space */
strcpy(buf2, buf);
/* Build the argv list */
argc = 0;
char* ptr = strtok(buf2, " ");
printf("ptr: %s\n", ptr);
while (ptr != NULL) {
//argv[argc]=ptr;
strcpy(argv[argc ], ptr);
ptr = strtok(NULL, " ");
}
argv[argc] = NULL;
printf("0: %s\n", argv[0]);
/* Ignore blank line */
if (argc == 0)
return 1;
/* Should the job run in the background? */
if ((bg = (*argv[argc - 1] == '&')) != 0)
argv[--argc] = NULL;
free(buf2);
printf("0: %s\n", argv[0]);
if(argv[1]!=NULL)
printf("1: %s\n", argv[1]);
return bg;
}
uj5u.com熱心網友回復:
您的代碼中有很多錯誤 - 我不會只檢查您的問題。
- 分配錯誤:
char** argv=malloc(MAXARGS*sizeof(char));
您需要為 char 指標分配空間 - 您為char. 最好使用物件而不是型別。
char **argv=malloc(MAXARGS * sizeof(*argv));
現在您已經為指標分配了記憶體——但沒有為 char 陣列分配記憶體以容納字串。要直接復制到argv[n]您需要分配此記憶體:
argv[n] = malloc(sizeof(**argv) * (strlen(ptr) 1));
if(argv[n]) strcpy(argv[n], ptr);
在您的代碼中,您永遠不會檢查結果malloc- 您需要在每次分配/重新分配后進行檢查
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/533948.html
標籤:CLinux字符串
