まず、エラーメッセージを読んで対応しましょう。文法エラーが出ているならそれはプログラムの要件を満たしていない、「プログラム未満の何か」でしかないということですから、まずプログラムとして成立させましょう。
int str_length = k;
これは、str_lengthという変数を宣言し、初期値として(この時点で)変数kが持っている値を与えるという指示です。しかし、変数kというのはプログラムにそれまで登場していませんから、なんじゃそりゃ初めて見たぞそんなの知らない、ということでエラーになっています。
基本的な文法は教科書等を確認してください。ポインタ以前(別に前とか後ろがあるわけじゃないですけれど)がわからないで新しい話に手を出したら混乱が増すばかりかと思います。
関数の呼び出しは
関数名( 引数リスト )
です。
関数で得た値を変数に代入したいのなら代入の演算子=を使って
変数 = 関数名(引数リスト)
で「右辺の値を左辺に」代入してください。
さて。別に悪いことではないのですがstr_length()だけを関数に切り出したのはどういう理由でしょう。なんだか唐突な印象があります。
関数に切り出すのなら、例えば、「入力した文字列を逆順に表示させたい」というお題に則ってやることを考えて
-
リスト入力を保存する変数を用意
-
入力を得る関数呼び出し
-
反転した結果を保存する変数を用意
-
反転する関数呼び出し
-
反転した結果を表示する関数呼び出し
という作業をすればよさそうで、いきなり「文字数を数える関数が要るなぁ」とは考えないのではないでしょうか。(こういうのを考えて、できれば紙に書き出してからプログラムコードを打ち始める、というのは結構大事なことだと思います)
そうすると、
C
1int main(void){
2 //入力する
3 char in[100];
4 scanf("%99s",in);
5
6 //反転する
7 char rev[100];
8 reverse(in,rev);
9
10 //表示する
11 printf("%s\n",rev);
12
13 return 0;
14}
ここまではポインタもへったくれもないですから、reverse関数にポインタ操作を盛り込んで
C
1void reverse( char* in, char* out){
2 int len=str_length(in);
3 in+=len-1; //ポインタが入力の一番最後の文字を指すようにする
4 for(int i=0;i<len;i++){
5 *out++=in--;
6 }
7 *out='\0';
8}
とでもすればそれっぽい、という話になるでしょう。
もっとも、お題が何の制限もなく「ポインタを使ってキーボード入力した文字列を逆順に表示」だけなら、途中他の文字列を介する必要もなく
C
1int main(void){
2 char in[100];
3 scanf("%99s",in);
4 int len=str_length(in);
5 char* t=in+len;
6 while(t!=in){
7 putchar(*--t);//printf("%c", *--t);でも同じ結果
8 }
9 return 0;
10}
あたりで十分じゃないでしょうか? いろいろ使って複雑にするのならそれなりの理由が必要と思います。
付け加えると、これも間違いではないのですが、変数の宣言と使う場所が微妙に離れているのも「なんだかいきあたりばったり/あちこちから集めた情報の切り貼りで作ってるなぁ」という印象を醸し出しているような気がします。
余談。
できるだけ「いろいろ使わない」とこんなのもできるげど...ポインタも使ってないや。
C
1int main(void){
2 char c=getchar();
3 // cへの値取り込みはscanf("%c",&c);を使ってもよい
4 if(c!='\n'){
5 main();
6 putchar(c);
7 }
8 return 0;
9}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。