21

WebアプリにCを使用しない理由の1つ。以下が含まれます。

以下のCがらくたの例の場合:

const char* foo = "foo";
const char* bar = "bar";
char* foobar = (char*)malloc(strlen(foo)+strlen(bar)+1);
strcpy(foobar, foo);
strcat(foobar, foo);

実際、定数はCで自然に連結できます。

const char foo[] = "foo";
const char bar[] = "bar";
char foobar[] = foo bar; // look Ma, I did it without any operator!

また、*の代わりに[]を使用すると、文字列を変更したり、文字列の長さを見つけたりすることもできます。

int foo_str_len = sizeof(foobar)-1;

したがって、Cを文字列で使用するのが難しいと(誤って)主張する前に、Cの使用方法を学んでください。


自分で試しましたが、エラーが発生します:

予想される'、'または';' 文字列定数の前

だから私の質問は:これを機能させるためにコンパイラに何かを伝える必要がありますか、それとも上記の投稿は単に間違っていますか?Cで文字配列を連結する他の方法を知っていることに注意してください。

4

3 に答える 3

40

(char *)malloc

Cでmallocの結果を型キャストしないでください。これこれを読んでください。

実際、定数はCで自然に連結できます。

いいえ、文字列リテラルはCで連結でき、連結する必要があります。"foo"これは文字列リテラルでconst char foo[]あり、定数文字列(文字の配列)です。コード"foo" "bar"は自動的に連結されますが、連結されfoo barません。

必要に応じて、文字列リテラルをマクロの背後に隠すことができます。

#define foo "foo"
#define bar "bar"
char foobar[] = foo bar; // actually works

したがって、Cを文字列で使用するのが難しいと(誤って)主張する前に、Cの使用方法を学んでください。

この例からわかるように、Cを文字列で使用するのはかなり困難です。彼らの傲慢な自信にもかかわらず、それを書いた人はさまざまな概念を混同し、それでもCの使い方を学ばなければなりません。

于 2012-04-24T12:47:03.490 に答える
7

constその答えは、誰かが文字列リテラルを文字列変数と連結することができたように見えます。文字列リテラルはそのように連結できます。私の推測では、オリジナルには変数ではなくプリプロセッサマクロがありました。

于 2012-04-24T10:02:14.230 に答える
-1
#include <stdio.h>
#include <string.h>

int
main(int argc, char *argv[])
{
    char *str1 = "foo";
    char *str2 = "bar";
    char ccat[strlen(str1)+strlen(str2)+1];

    strncpy(&ccat[0], str1, strlen(str1));
    strncpy(&ccat[strlen(str1)], str2, strlen(str2));
    ccat[strlen(str1)+strlen(str2)+1] = '\0';

    puts(str1);
    puts(str2);
    puts(ccat);
}

このコードは連結されており、を必要str1としない場合、出力は次のようになります。str2malloc

foo
bar
foobar
于 2016-07-27T09:55:33.497 に答える