1

私はCのポインターの概念にかなり慣れていません.2つの変数があるとしましょう:

char *arch_file_name;
char *tmp_arch_file_name;

arch_file_nameここで、 toの値をコピーしtmp_arch_file_nameて、末尾に「tmp」という単語を追加します。私はそれらを文字列として見ているので、次のようになります。

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

ただし、strcat()が呼び出されると、両方の変数が変化し、同じになります。そのうちの 1 つを変更し、もう1 つを変更しないでください。後で 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 に答える