1

我对 C 中指针的概念相当陌生。假设我有两个变量:

char *arch_file_name;
char *tmp_arch_file_name;

现在,我想复制 to 的值arch_file_nametmp_arch_file_name在其末尾添加单词“tmp”。我将它们视为字符串,所以我有:

strcpy(&tmp_arch_file_name, &arch_file_name);
strcat(tmp_arch_file_name, "tmp");

但是,当strcat()被调用时,这两个变量都会改变并且是相同的。我希望其中一个改变,另一个保持不变。我必须使用指针,因为我稍后将这些名称用于 fopen()、rename() 和 delete() 函数。我怎样才能做到这一点?

4

4 回答 4

3

你想要的是:

strcpy(tmp_arch_file_name, arch_file_name);
strcat(tmp_arch_file_name, "tmp");

您只是在原始代码中复制指针(和其他随机位,直到达到 0 字节),这就是它们最终相同的原因。

正如 shinkou 正确指出的那样,确保tmp_arch_file_name指向足够大小的缓冲区(不清楚您是否在代码中这样做)。最简单的方法是执行以下操作:

char buffer[256];
char* tmp_arch_file_name = buffer;
于 2012-10-23T04:23:25.537 回答
2

首先,您需要确保这些指针实际上指向有效内存。事实上,它们要么是 NULL 指针,要么是任意值,它们都不能很好地工作:

char *arch_file_name = "somestring";
char tmp_arch_file_name[100]; // or malloc

然后你cpycat,但使用指针,而不是你当前拥有的指针:

strcpy (tmp_arch_file_name, arch_file_name);  // i.e., no "&" chars
strcat (tmp_arch_file_name, "tmp");

请注意,此代码中没有进行边界检查 - 示例不需要它,因为很明显所有字符串都适合分配的缓冲区。

但是,除非您完全控制数据,否则更强大的解决方案会在盲目复制或附加之前检查大小。由于它与问题没有直接关系,我不会在这里添加它,但这是需要注意的。

于 2012-10-23T04:26:08.693 回答
2

在使用指针之前,您需要分配内存。假设它arch_file_name已经被赋值,你应该计算结果字符串的长度,分配内存,做strcpy,然后strcat,像这样:

char *arch_file_name = "/temp/my.arch";
// Add lengths of the two strings together; add one for the \0 terminator:
char * tmp_arch_file_name = malloc((strlen(arch_file_name)+strlen("tmp")+1)*sizeof(char));
strcpy(tmp_arch_file_name, arch_file_name);
//    ^ this   and   this ^ are pointers already; no ampersands!
strcat(tmp_arch_file_name, "tmp");

// use tmp_arch_file_name, and then...
free(tmp_arch_file_name);
于 2012-10-23T04:28:13.487 回答
1

&运算符是地址运算符,即返回变量的地址。但是,在指针上使用它会返回指针存储的地址,而不是它指向的地址。

于 2012-10-23T04:53:14.293 回答