2つの文字列を追加する方法
name = "derp" + "herp";
を試しましたが、エラーが発生しました。
式は整数型または列挙型でなければなりません
Cは他の言語が持っている文字列をサポートしていません。 Cの文字列は、最初のNULL文字で終わるchar
の配列へのポインタです。 Cには文字列連結演算子はありません。
2つの文字列を連結するにはstrcat
を使用してください。あなたはそれを行うために次の関数を使用することができます:
#include <stdlib.h>
#include <string.h>
char* concat(const char *s1, const char *s2)
{
char *result = malloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
strcpy(result, s1);
strcat(result, s2);
return result;
}
これはこれを実行する最速の方法ではありませんが、あなたは今それについて心配するべきではありません。この関数はヒープに割り当てられたメモリのブロックを呼び出し元に返し、そのメモリの所有権を渡します。必要でなくなったときにメモリをfree
するのは呼び出し側の責任です。
このように関数を呼び出します。
char* s = concat("derp", "herp");
// do things with s
free(s); // deallocate the string
もしあなたがパフォーマンスに悩まされていたのであれば、null終端文字を探すために入力バッファを繰り返しスキャンすることを避けたいでしょう。
char* concat(const char *s1, const char *s2)
{
const size_t len1 = strlen(s1);
const size_t len2 = strlen(s2);
char *result = malloc(len1 + len2 + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
memcpy(result, s1, len1);
memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator
return result;
}
あなたが文字列に対して多くの仕事をすることを計画しているなら、あなたは文字列のためのファーストクラスサポートを持っている異なる言語を使うほうが良いかもしれません。
#include <stdio.h>
int main(){
char name[] = "derp" "herp";
printf("\"%s\"\n", name);//"derpherp"
return 0;
}
David Heffernan 説明 彼の答えの中の問題、そして私は改良されたコードを書きました。下記参照。
任意の数の文字列を連結するのに便利な 可変関数 を書くことができます。
#include <stdlib.h> // calloc
#include <stdarg.h> // va_*
#include <string.h> // strlen, strcpy
char* concat(int count, ...)
{
va_list ap;
int i;
// Find required length to store merged string
int len = 1; // room for NULL
va_start(ap, count);
for(i=0 ; i<count ; i++)
len += strlen(va_arg(ap, char*));
va_end(ap);
// Allocate memory to concat strings
char *merged = calloc(sizeof(char),len);
int null_pos = 0;
// Actually concatenate strings
va_start(ap, count);
for(i=0 ; i<count ; i++)
{
char *s = va_arg(ap, char*);
strcpy(merged+null_pos, s);
null_pos += strlen(s);
}
va_end(ap);
return merged;
}
#include <stdio.h> // printf
void println(char *line)
{
printf("%s\n", line);
}
int main(int argc, char* argv[])
{
char *str;
str = concat(0); println(str); free(str);
str = concat(1,"a"); println(str); free(str);
str = concat(2,"a","b"); println(str); free(str);
str = concat(3,"a","b","c"); println(str); free(str);
return 0;
}
出力:
// Empty line
a
ab
abc
メモリリークを避けるために、割り当てられたメモリが不要になったら解放してください。
char *str = concat(2,"a","b");
println(str);
free(str);
あなたはstrcat
、あるいはもっとstrncat
を使うべきです。 Googleそれ(キーワードは「連結」です)。
私はあなたが一回限りのもののためにそれを必要とすると思います。私はあなたがPC開発者だと思います。
スタックを使う、ルーク。どこでもそれを使用してください。小さい割り当てにmalloc/freeを使用しないでください、ever。
#include <string.h>
#include <stdio.h>
#define STR_SIZE 10000
int main()
{
char s1[] = "oppa";
char s2[] = "gangnam";
char s3[] = "style";
{
char result[STR_SIZE] = {0};
snprintf(result, sizeof(result), "%s %s %s", s1, s2, s3);
printf("%s\n", result);
}
}
文字列あたり10 KBで十分でない場合は、サイズにゼロを追加しても気にしないでください - とにかくスコープの最後にスタックメモリを解放します。
Cのように文字列リテラルを追加することはできません。文字列リテラル1 +文字列リテラル2 + NULL終端文字用のバイトのサイズのバッファを作成し、対応するリテラルをそのバッファにコピーする必要があります。ヌル文字で終了していることを確認してください。あるいはstrcat
のようなライブラリ関数を使用することもできます。
GNU拡張子なし
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
const char str1[] = "First";
const char str2[] = "Second";
char *res;
res = malloc(strlen(str1) + strlen(str2) + 1);
if (!res) {
fprintf(stderr, "malloc() failed: insufficient memory!\n");
return EXIT_FAILURE;
}
strcpy(res, str1);
strcat(res, str2);
printf("Result: '%s'\n", res);
free(res);
return EXIT_SUCCESS;
}
代わりにGNU拡張子を使用する:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
const char str1[] = "First";
const char str2[] = "Second";
char *res;
if (-1 == asprintf(&res, "%s%s", str1, str2)) {
fprintf(stderr, "asprintf() failed: insufficient memory!\n");
return EXIT_FAILURE;
}
printf("Result: '%s'\n", res);
free(res);
return EXIT_SUCCESS;
}
Cの2つの文字列を連結するには、少なくとも3つの方法があります。
1)文字列2を文字列1の末尾にコピーする
#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
char str1[MAX],str2[MAX];
int i,j=0;
printf("Input string 1: ");
gets(str1);
printf("\nInput string 2: ");
gets(str2);
for(i=strlen(str1);str2[j]!='\0';i++) //Copying string 2 to the end of string 1
{
str1[i]=str2[j];
j++;
}
str1[i]='\0';
printf("\nConcatenated string: ");
puts(str1);
return 0;
}
2)文字列1と文字列2を文字列3にコピーする
#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
char str1[MAX],str2[MAX],str3[MAX];
int i,j=0,count=0;
printf("Input string 1: ");
gets(str1);
printf("\nInput string 2: ");
gets(str2);
for(i=0;str1[i]!='\0';i++) //Copying string 1 to string 3
{
str3[i]=str1[i];
count++;
}
for(i=count;str2[j]!='\0';i++) //Copying string 2 to the end of string 3
{
str3[i]=str2[j];
j++;
}
str3[i]='\0';
printf("\nConcatenated string : ");
puts(str3);
return 0;
}
3)strcat()関数を使用する
#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
char str1[MAX],str2[MAX];
printf("Input string 1: ");
gets(str1);
printf("\nInput string 2: ");
gets(str2);
strcat(str1,str2); //strcat() function
printf("\nConcatenated string : ");
puts(str1);
return 0;
}
#include <string.h>
#include <stdio.h>
int main()
{
int a,l;
char str[50],str1[50],str3[100];
printf("\nEnter a string: ");
scanf("%s",str);
str3[0]='\0';
printf("\nEnter the string which you want to concat with string one: ");
scanf("%s",str1);
strcat(str3,str);
strcat(str3,str1);
printf("\nThe string is %s\n",str3);
}
Cでは、一般的なファーストクラスオブジェクトとして、実際には文字列を持っていません。それらを文字の配列として管理する必要があります。つまり、配列の管理方法を決定する必要があります。 1つの方法は、通常の変数です。スタックに置かれます。別の方法は、malloc
を使用してそれらを動的に割り当てることです。
ソートが完了したら、ある配列の内容を別の配列にコピーして、strcpy
またはstrcat
を使用して2つの文字列を連結できます。
とは言っても、Cには「文字列リテラル」という概念があります。これはコンパイル時に知られる文字列です。使用すると、それらは読み取り専用メモリに配置された文字配列になります。ただし、"foo" "bar"
のように2つの文字列リテラルを隣同士に書いて連結することは可能です。これにより、文字列リテラル "foobar"が作成されます。