構造体が戻り値の関数についてわかりません
問題文:文字列を保存する構造体word_pairを下記の様に定義する。
typedef struct word_pair{
char longer_word[10];
char shorter_word[10];
char combined_word[20];
int longer_word_length;
int shorter_word_length;
}word_pair_t;
この構造体を新たに作成し、データをセットして返す関数
word_pair_t create_word_pair(char *a, char *b);
を作成せよ。create_word_pairは以下の仕様を満たす。
create_word_pairは2つの文字列a,bを比較し、長い文字列をlonger_wordに、短い文字列をshorter_wordに代入する。また、これらの長さが同じ場合には辞書的に後ろのものをlonger_wordに、前のものをshorter_wordに代入する。もし、a,bがまったく同じ文字列であれば、エラーメッセージを出力した上で、longer_wordに入力された文字列をshorter_wordに空の文字列を代入する。またcombined_wordにはlonger_word とshorter_wordをスペース区切りで結合したものを代入する。
標準入力から文字列を2つ読み取り、create_word_pairを用いて、新たにそれらのデータが代入された構造体を作成した後に、これらのメンバ変数を全て、標準出力に表示するプログラムを作成せよ。
という問題で、とりあえず自分で細かい条件は無視して文字列を標準入力してから構造体のメンバに文字を格納するところまでやろうとしたのですが、strcpyするのに型が違うとコンパイルエラーが出たのですが、型は一緒だと私は思っているため、なぜ違うのかわかりません。
また辞書的に後ろ前をif文でどのように表現すればいいのかと、文字列結合にstrcatを使うと思うのですが、結合の合間にスペースをいれる方法が分かりません。以下自分のコード。
#include<stdio.h>
#include<string.h>
#define max 50
typedef struct word_pair{
char longer_word[10];
char shorter_word[10];
char combined_word[20];
int longer_word_length;
int shorter_word_length;
}word_pair_t;
word_pair_t create_word_pair(char *a, char *b);
int main()
{
char a[max],b[max];
word_pair_t *str;
printf("文字列を2つ入力してください。\n");
printf("1つ目:");
scanf("%s\n",a);
printf("2つ目:");
scanf("%s\n",b);
create_word_pair(a,b);
printf("長い方の文字列%s\n",str->longer_word);
printf("短い方の文字列%s\n",str->shorter_word);
printf("連結した文字列%s\n",str->combined_word);
printf("長い方の文字列の長さ%d\n",str->longer_word_length);
printf("短い方の文字列の長さ%d\n",str->shorter_word_length);
return 0;
}
word_pair_t create_word_pair(char *a, char *b)
{
int d, e;
char c[max];
word_pair_t *str;
d = strlen(a);
e = strlen(b);
if(d > e){
strcpy(str->longer_word, a);
strcpy(str->shorter_word, b);
c = strcat(a,b);
strcpy(str->combine_word, c);
strcpy(str->longer_word_length, d);
strcpy(str->shorter_word_length, e);
}
if(d < e)
{
strcpy(str.longer_word, b);
strcpy(str.shorter_word, a);
c = strcat(a,b);
strcpy(str.combine_word, c);
strcpy(str.longer_word_length, e);
strcpy(str.shorter_word_length, d);
}
}
お礼
なるほどなるほど、確かにそういうことでしょう。 デフォルトでは、2行目のようにリストコンテキストになるんですね。 配列の要素が1つしかなくて、それをreverseするから、 結果だけ見ると、何も起こっていないように見える。 納得しました。 ありがとうございました。