web-dev-qa-db-ja.com

Cでchar配列を連結します

私はchar配列を持っています:

char* name = "hello";

その名前に拡張子を追加して作りたい

hello.txt

これどうやってするの?

name += ".txt"動作しません

35
user69514

strcat 関数をご覧ください。

特に、これを試すことができます:

const char* name = "hello";
const char* extension = ".txt";

char* name_with_extension;
name_with_extension = malloc(strlen(name)+1+4); /* make space for the new string (should check the return value ...) */
strcpy(name_with_extension, name); /* copy name into the new var */
strcat(name_with_extension, extension); /* add the extension */
54
David Underhill

私はchar配列を持っています:

char* name = "hello";

いいえ、 文字列リテラル への文字ポインターがあります。多くの使用法では、nameが指すものに興味があるか、文字列値 "hello」。 悪いことが起こる可能性がある であるため、リテラル( "hello")を変更しないでください。

伝えるべき重要なことは、Cには適切な(またはfirst-class)文字列型がないことです。 「文字列」は、通常、文字列の終わりを示すために終端のヌル(「\ 0」または10進数の0)文字を持つ文字(文字)の配列、または文字の配列へのポインタです。

Character ArraysThe C Programming Languageのセクション1.9を読むことをお勧めします(28ページの第2版)。 Cを学習するために、この小さな本(300ページ未満)を読むことを強くお勧めします。

あなたの質問に加えて、セクション6- 配列とポインタ とセクション8- 文字と文字列C FAQ が役立つかもしれません。質問 6.5 、および 8.4 は開始するのに適した場所です。

あなたの抜粋が機能しない理由を理解するのに役立つことを願っています。他の人は、それを機能させるために必要な変更を概説しています。基本的に、文字列全体を終了(終了)文字 '\ 0'で格納するのに十分な大きさのchar配列(文字の配列)が必要です。次に、標準Cライブラリ関数strcpy(またはより優れたstrncpy)を使用して「Hello」をコピーし、標準Cライブラリ関数strcat(または優れたstrncat)関数を使用して連結します。 string.hヘッダーファイルをインクルードして、関数宣言を宣言する必要があります。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main( int argc, char *argv[] )
{
    char filename[128];
    char* name = "hello";
    char* extension = ".txt";

    if (sizeof(filename) < strlen(name) + 1 ) { /* +1 is for null character */
        fprintf(stderr, "Name '%s' is too long\n", name);
        return EXIT_FAILURE;
    }
    strncpy(filename, name, sizeof(filename));

    if (sizeof(filename) < (strlen(filename) + strlen(extension) + 1) ) {
        fprintf(stderr, "Final size of filename is too long!\n");
        return EXIT_FAILURE;
    }
    strncat(filename, extension, (sizeof(filename) - strlen(filename)) );
    printf("Filename is %s\n", filename);

    return EXIT_SUCCESS;
}
17
mctylr

最初に strcpy で現在の文字列をより大きな配列にコピーし、次に strcat を使用します。

たとえば、次のことができます。

char* str = "Hello";
char dest[12];

strcpy( dest, str );
strcat( dest, ".txt" );
11
Salv0

asprintfは100%標準ではありませんが、GNUおよびBSD標準Cライブラリを介して利用できるため、おそらくお持ちでしょう。そこに座ってキャラクターを数えます。

char *hi="Hello";
char *ext = ".txt";
char *cat;

asprintf(&cat, "%s%s", hi, ext);
5
bk.

ここに答えをコピーして貼り付けるか、ホストJoelが strcat について言っていることを読んでください。

5
Will
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *name = "hello";

int main(void) {
  char *ext = ".txt";
  int len   = strlen(name) + strlen(ext) + 1;
  char *n2  = malloc(len);
  char *n2a = malloc(len);

  if (n2 == NULL || n2a == NULL)
    abort();

  strlcpy(n2, name, len);
  strlcat(n2, ext, len);
  printf("%s\n", n2);

  /* or for conforming C99 ...  */
  strncpy(n2a, name, len);
  strncat(n2a, ext, len - strlen(n2a));
  printf("%s\n", n2a);

  return 0; // this exits, otherwise free n2 && n2a
}
1
DigitalRoss

Sprintf()関数を使用して、ストリングを連結できます。あなたの場合、例えば:

char file[80];
sprintf(file,"%s%s",name,extension);

そして、「file」内の連結された文字列を終了します。

0
CASO Student