0

私は C の初心者で、2 つの文字列を連結する簡単なプログラムを作成しようとしています。Linux ボックスで実行中に、次の例外が発生します。

test.c:12:10: エラー: 'strcat' のタイプが競合しています</p>

ここで何が欠けているかを理解するのを手伝ってもらえますか:

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

void main() {
  // string concatenation
  char str1[] = {'S', 'h'};
  char str2[] = {'X', 'y'};
  strcat(str1, str2);
}

void strcat(char str1[], char str2[]) {
  int index;
  int str1_length = strlen(str1);
  for(index=0; index<strlen(str2); index++) {
    str1[index + str1_length] = str2[index];
  }
}
4

10 に答える 10

5

あなたは標準の署名strcatを持っていません:

char *strcat(char *dest, const char *src);

を含める場合は、一致させる必要がありますstring.h。または、実装に別の名前を付けます(my_strcatたとえば)。

また、テスト文字列をnullで終了するstrlenこともできます。そうしないと、これらの呼び出しによって非常に興味深い結果が得られます。さらに、最初の文字列に割り当てられたメモリの終わりを超えて書き込むこと(およびそれによって未定義の動作を引き起こすこと)を避けるために、最後に2番目の文字列を収めるのに十分なスペースを確保してください。

于 2013-01-04T06:19:33.957 に答える
2

C言語(string.h)には事前定義された関数「strcat」があるため、strcatを呼び出そうとすると、コンパイラはその組み込み関数と定義済み関数の間で競合しているように見えます。そのため、strcat 関数の名前を変更することをお勧めします。

于 2013-01-04T06:34:11.750 に答える
2

名前の競合について他の人が言ったことは別として、適切な文字列もありません。

C では、文字列は null ターミネータ ( \0) で終わります。

この方法で文字列を作成しました:

char str1[] = {'S', 'h'};

したがって、S と h の 2 文字しかありません。

などの関数で文字列を使用できるようにするstrlenには、null ターミネータが必要です。
私はお勧め:

char str1[] = {'S', 'h', '\0'};
于 2013-01-04T06:32:22.173 に答える
2

あなたのコードには多くのエラーがあります。まず、文字列 str1 と str2 を null で終了する必要があります。宣言を次のように変更することで修正できます

char str1[] = "Sh";
char str2[] = "Xy";

または

char str1[] = {'S', 'h', '\0'};
char str2[] = {'X', 'y', '\0'};

次に、strcatは予約済みの名前であるため、メイン関数はバージョンを呼び出すのではなく、ヘッダー ファイルにあるバージョンを呼び出します<string.h>。関数の名前を変更するか、ヘッダーを含めないことで、これを修正できますstring.h。2 番目のものを実行する場合は、関数 も実装する必要があります。strlenこれは にあるためstring.hです。

于 2013-01-04T08:15:52.277 に答える
1

string.hすでに提供されているstrcatので、関数の名前を別の名前に変更するだけです。

于 2013-01-04T06:18:55.560 に答える
1

ライブラリには、署名付きのstrcat関数がすでに定義されています。ユーザー定義関数が競合しています。Cはオーバーロードをサポートしていないため、関数の名前を変更する必要があります。string.hchar *strcat(char *Destination, char *Source);

連結する前に、宛先のchar配列を宣言して、連結された文字列を保持するのに十分なスペースを確保する必要もあります。そうでない場合は、配列の境界を超えて実行され、奇妙な問題が発生する可能性があります。

また、標準ライブラリは文字列の終わりを決定するためにnullで終了する必要があるため、文字列はnullで終了する必要があります。ヌルターミネータstrlenがないと、文字列の長さを把握できません(誤って次のメモリ位置にヌル文字が含まれている場合を除きます。このような事故に頼ってはいけません)。

于 2013-01-04T06:19:21.233 に答える
1

string.hで宣言されているため、関数にその名前を付けることはできません。関数の名前をmyStrcatまたはその性質のものに変更するだけです。

于 2013-01-04T06:20:04.817 に答える
1

関数名がにすでに存在する関数と競合しているため、に置き換えstrcatてくださいstr_catstring.h

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

void main() {
  // string concatenation
  char str1[] = {'S', 'h'};
  char str2[] = {'X', 'y'};
  str_cat(str1, str2);
}

void str_cat(char str1[], char str2[]) {
  int index;
  int str1_length = strlen(str1);
  for(index=0; index<strlen(str2); index++) {
    str1[index + str1_length] = str2[index];
  }
}
于 2013-01-04T06:20:17.237 に答える
0
#include<stdio.h>
#include<string.h>

void mystrcat(char str1[], char str2[]);

void main() {
char str1[] = {'S', 'h' , '\0'};
char str2[] = {'X', 'y', '\0'};
mystrcat(str1, str2);
}

// string concatenation
void mystrcat(char str1[], char str2[]) {
int index;
int str1_length = strlen(str1);
for(index=0; index<strlen(str2); index++) {
    str1[index + str1_length] = str2[index];
}
str1[index + str1_length] = '\0';
printf("%s\n",str1);
}
于 2013-01-04T09:05:42.407 に答える
0

以下のようにコードを変更するだけです。

 replace char str1[] = {'S', 'h'} by char str1[] = {'S', 'h', '\0'};
 replace char str2[] = {'X', 'y'} by char str2[] = {'X', 'y', '\0'};
于 2013-01-04T07:56:06.803 に答える