いくつかのエラーがあります:
char Jones(char, char);
これは、文字列に必要な char * ではなく、単一の文字のみを取ります。
result=Jones(name, surname);
ここで結果は配列です。C では、配列に割り当てることはできません。
char Jones(char name, char surname)
{ char result[80];
...
return result;
}
result
ここでは、ローカル変数を返します。ただし、文字列を返すには、char* を返す必要があります。しかし、その char* は Jones 関数内のローカル変数を指し、関数が終了すると無効になります。1 つの解決策は、呼び出し元が所有する結果を書き込むバッファーを渡すことです。確実な名前と名前を組み合わせるアルゴリズムも間違っています。確実な名前では何もしません。
これを行う必要があります:
char *Jones(char*, char* , char *);
int main() {
char name[]="Andrew";
char surname[]="Jones";
char result[80];
char *p;
p = Jones(name, surname, result);
puts(p);
return 0;
}
char *Jones(char *name, char *surname, char *result)
{
int length;
int i,k;
length = strlen(surname);
for (i=0; i<length ; i++)
{
result[i] = surname[i];
}
result[i++] = ' '; //add a space
length = strlen(name);
for (k=0; k<length ; k++, i++)
{
result[i] = name[k];
}
result[i] = 0; //add nul terminator to end the string
return result;
}
連結は、多くの方法で単純化できます。
strcpy(result, surename);
strcat(result, " ");
strcat(result, name);
または、ジョーンズ関数で次のことができます。
sprintf(result, "%s %s", surename, name);
いずれの場合も、バッファ内に収まらない何かを渡すと、結果バッファを簡単にオーバーフローさせるため、関数はかなり脆弱ですresult
。