1

こんにちは、私の質問は、2 つの C スタイルの文字列を 1 つに追加するにはどうすればよいですか?

C++ のやり方 (std::string) に慣れているので、C スタイルの文字列に触れたことがなく、現在の開発プロジェクトのためにそれらについてもっと学ぶ必要があります。例えば:

 char[] filename = "picture.png";
 char[] directory = "/rd/";
 //how would I "add" together directory and filename into one char[]?

前もって感謝します。

4

6 に答える 6

3

Use strcat().

See here: http://www.cplusplus.com/reference/clibrary/cstring/strcat/

于 2010-11-22T23:52:06.680 に答える
0
#include <stdlib.h>
#include <string.h>

// ...

char * fullpath;

fullpath = malloc(strlen(directory)+strlen(filename)+1);
if (fullpath == NULL)
{
  // memory allocation failure 
}
strcpy(fullpath, directory);
strcat(fullpath, filename);
于 2010-11-22T23:53:59.833 に答える
0

You need a big enough buffer, that, assuming you don't have filename's and directory's size handy at compile-time, you must get at run-time, like so

char *buf = (char *) malloc (strlen (filename) + strlen (directory) + 1);
if (!buf) { /* no memory, typically */ }
strcpy (buf, filename);
strcat (buf, directory);
于 2010-11-22T23:54:58.387 に答える
0

より低いレベルで作業していることに注意してください。自動的にメモリが割り当てられるわけではありません。2 つの文字列と null ターミネータを保持するのに十分なメモリを割り当ててから、それらを適切な場所にコピーする必要があります。

于 2010-11-22T23:55:44.597 に答える
0

charと の両方を保持するのに十分な大きさの配列filenameを宣言/割り当ててくださいdirectory。次に、xxpor が提案したようにstrcat()(または) を使用します。strncat()

于 2010-11-22T23:56:09.870 に答える
0

「文字列」が実際にメモリ内でどのように表現されるかを考える必要があります。C では、文字列は割り当てられたメモリのバッファであり、0 バイトで終了します。

filename  |p|i|c|t|u|r|e|0|
directory |/|r|d|/|0|

必要なのは、両方の文字列のメモリ内容と最後の 0 バイトを一緒にコピーするための新しいメモリ空間です。

path      |p|i|c|t|u|r|e|/|r|d|/|0|

これにより、次のコードが得られます。

int lenFilename = strlen(filename); // 7
int lenDirectory = strlen(directory); // 4
int lenPath = lenFilename + lenDirectory; // 11 I can count
char* path = malloc(lenPath + 1);
memcpy(path, filename, lenFilename);
memcpy(path + lenFilename, directory, lenDirectory);
path[lenPath] = 0; // Never EVER forget the terminating 0 !

...

free(path); // You should not forget to free allocated memory when you are done

(このコードには 1 ずつずれている可能性があります。実際にはテストされていません。午前 01:00 です。寝る必要があります!)

于 2010-11-22T23:57:35.153 に答える