2014-09-28 105 views
0

我有一些代码看起来是这样的:修改C字符串

typedef struct 
{ 
    char mode;  //e = encrypt, d = decrypt 
    char* infile; //name of infile 
    char* outfile; //name of outfile 
    char* password; //password string 
} cipher_t; 

int check_files(cipher_t *data) 
{ 
    char temp_path[] = "temp-XXXXX"; 

    if(/** infile == stdin *//) 
    { 
    mkstemp(temp_path); 
    *data.infile = temp_path; 
    } 

    //do stuff and return 

} 

基本上,我想要做的是检测用户是否从stdin要输入数据,如果这样做一个临时文件,我可以做东西。

这里的问题是,当我如上所示设置我的infile路径时,该数据在退出函数时不会保留,因为它是局部变量。所以当我退出函数时,临时文件路径在结构中丢失。除了物理复制字符串之外,还有什么可以保留值的吗?

+0

为什么你不想使用'strcpy()'? – user1336087 2014-09-28 06:02:59

+0

您尚未为您正在使用的指针分配任何空间,即 即cipher_t * data和char * infile。除非你使用malloc分配给它们一些空间,否则它们都是指针和 ,它们将继续给出分段错误,因为它们没有任何有效的地址指向。 – 2014-09-28 06:16:46

+0

*“除了物理复制字符串之外,还有什么可以保留该值的吗?”*不,在堆栈上创建的字符串无法保存,而无需将字符串复制到堆栈外存储。所以你唯一的选择就是不要把字符串放在堆栈中,例如将'infile'的声明更改为'char infile [32]',以便字符串的存储位于结构本身中。 – user3386109 2014-09-28 07:01:57

回答

2

data->infile = strdup(temp_path);

+0

[strdup](http://stackoverflow.com/questions/252782/strdup-what-does-it-do-in-c)使用strcpy。 – user1336087 2014-09-28 06:10:02

+1

@Ani文档没有提到任何有关这方面的信息。它可能会使用,可能不会,只要它按照libc的编译器实现来决定,而不是C标准。事实上,如果你已经知道你要复制的内容的大小(要求为新字符串分配缓冲区),那么使用'strcpy()'就没有什么意义了,所以'strdup() '只会涉及'strlen()','malloc()'和'memcpy()'。 – Havenard 2014-09-28 06:33:49

+1

'strdup()'必须在任何情况下执行“*物理副本*”。 – alk 2014-09-28 09:33:09

1

除了物理复制串,还有什么我能做的保留价值?

你可以声明它static,它可以让“字符串”在整个程序的实时时间内存活。

static char temp_path[] = "temp-XXXXX"; 

但要知道,这temp_path只存在一次,所以被多个线程访问可能会导致混乱。

+0

这也意味着'check_files'函数只能在程序的整个生命周期中调用一次。无论它是否是多线程都没关系。第二次调用函数将保证覆盖第一个文件名。 – user3386109 2014-09-28 14:41:01