0

这个问题被问了很多,但特别是关于包含指针的结构,并没有完全帮助我的情况。我想要做的是 strtok() 第一个也是唯一一个基于“|”的命令行参数 特点。例如,它将类似于:“ls -l | grep ^d | wc -l”。完成后,我想将我标记的项目写入 LOGFILE。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
void main(void)
{
FILE *logfp =  fopen("LOGFILE", "w");   
char * commands; 
char * container[4];
char commandLine[] = ("test|test2|test3|test4\n");
int i = 0;  
commands = strtok(commandLine, "|");
while(commands != NULL) 
{       
    container[i] = commands; 
    printf("Being stored in container: %s\n", container[i]);    
    i++;  
    commands = strtok(NULL, "|");
}   
printf("This is the size of the container: %d\n", (int)sizeof(container));  
fwrite(container,1,sizeof(container),logfp);
fclose(logfp);

}

指针上的 sizeof() 也返回 8 而不是 char 的正确数量,所以这是另一个问题。除此之外,日志文件中充满了我猜测的指针指向的内存地址。我想将标记化的字符串写入 LOGFILE。我该怎么做?

4

1 回答 1

3

正如您所说,使用 sizeof(container) 只会为您提供指针的大小。无论它指向什么,这将是 8。如果您想获得 char (1) 的大小,可以使用 sizeof(*container) 取消引用指针。但是,这仍然不是您想要的。

您的方法的问题在于,为了一次 fwrite() 所有字符串,它们需要按顺序存储在内存中,而它们不是。唯一按顺序存储的是容器数组中的 char*s。这些指针指向实际的字符串数据,它们都位于完全不同的内存位置。

话虽这么说,解决方案很简单:只需 fwrite() 一次一个字符串。

while(commands != NULL) 
{       
    container[i] = commands;
    printf("Being stored in container: %s\n", container[i]);

    //Write one string, using strlen() to calculate the length
    fwrite(container[i], 1, strlen(container[i]), logfp);

    i++;  
    commands = strtok(NULL, "|");
}

但请记住,这些字符串将全部混合在一起。除非您在它们之间显式添加空格或换行符,否则该文件将看起来像“testtest2test3test4”。

于 2013-04-01T03:06:55.583 回答