2016-11-20 1 views
0

これは私のコードが今どのように見えるかです:は nの特定の量を配るCで関数を作成する助けが必要

#include <stdio.h> 

void print_lines(int n); 

int main() { 
printf("%i", print_lines(7)); 
return 0; 
} 

void print_lines(int n) { 
    int i; 
    scanf("%i", &n); 
    for (i = 1; n != 0; --1) 
     printf("\n"); 
} 

目的は、ユーザーが置くよう関数はできるだけ多くの新しい行を出力していることですスキャンf機能を備えている。 私は何が間違っていますか?ここで

+0

あなたはさらに明確になりますか?私はあなたが最後の行で何を意味しているかを正確に理解できません。 – skrtbhtngr

+0

ええと、関数がすべきことは、プログラムのユーザがscanf関数を使って挿入する行数(\ n)をプリントアウトすることです。したがって、その場合は上の7行にする必要があります。 –

+0

main関数では、次のように関数を呼び出すだけです:print_lines(7);それをprintf関数の引数として渡さないでください。また、print_lines関数のサイクルで-lが意味するものは何ですか? –

答えて

1

は、あなたが望むものです:

#include <stdio.h> 

void print_lines(int n); 

int main() { 
print_lines(7); 
return 0; 
} 

void print_lines(int n) { 
    int i; 
    for (i = n; i >= 1; --i) 
     printf("\n"); 
} 
  • print_linesの戻り値の型がvoidある場合は、その値を使用していたかのように、あなたが式の中で使用することはできません。
  • 値(7)を関数に渡す場合は、scanfを使用して再度読み取る必要はありません。
  • すでにprint_linesに印刷している場合はprintfmainに使用する必要はありません。関数呼び出しだけで十分です。
  • for (i = 1; n != 0; --1)あなたをどこにも取得しません。この行だけでもエラーが多すぎます。 を初期化して、nをテストし、1をインクリメントします(これはCでは不可能です)。

理解を深めるためにいくつかの基本をお読みください。

もう一つの「トリック」は次のようになります。

printf("%.*s\n", 7, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); 

これは、3番目の引数として与えられた20文字の文字列から最初の7つの文字を印刷します。

+0

print_linesのscanfがなぜ機能するのですか? –

+0

@StoryTeller:私はOPが与えた元のコードにわずかな変更を加えています。他にも多くの改善の余地があります。 – skrtbhtngr

+0

私は 'i> 0'がもっと良くなり、' i> = 1'と感じます。 – alk

1

私はあなたがで取得しようとしているもののより良い実装はこのだと思う:

#include <stdio.h> 

void print_lines(int n); 

int main() { 
    /* take input here (how many lines etc) */ 
    print_lines(7)); 
    return 0; 
} 

void print_lines(int n) { 
    int i; 
    for (i = 0; i < n; ++i) 
     printf("\n"); 
} 

あなたはprintf関数の内部で使用したい変種は、以下のようになります。

#include <stdio.h> 

void print_lines(int n); 

int main() { 
    /* take input here (how many lines etc) */ 
    char* lines = print_lines(7); 
    printf("%s", lines); 
    free(lines) // <-- important 
    return 0; 
} 

char* print_lines(int n) { 
    int i; 
    char* res = malloc(sizeof(char) * (n + 1)); // <-- important, for \0 termination 
    for (i = 0; i < n; ++i) 
     res[i] = '\n'; 
    res[n] = '\0'; 
    return res; 
} 

しかし、私はむしろ、より汎用的なアプローチを使用したいと思います。ここでは、Nに2番目のパラメータとして関数に渡される任意の文字を渡すことができます。私はあなたにその部分を残します。

編集:ここでは、ユーザーが作成したバッファ付きバージョンです:

#include <stdio.h> 

void print_lines(int n); 

int main() { 
    /* take input here (how many lines etc) */ 
    char buf[8]; // if you use GCC you can use char buf[N], these are variable length arrays, if not, use a similar malloc method above 
    print_lines(7, buf); 
    printf("%s", buf); 
    return 0; 
} 

void print_lines(int n, char buf[]) { 
    int i; 
    for(i = 0; i < n; ++i) 
     buf[i] = '\n'; 
    buf[n] = '\0'; 
} 

そして最後に、ファンタジー・ソリューション・落語が提案:上記の溶液で

#include <stdio.h> 

void most_generic_printN(int n, char c, FILE* f) { 
    int i; 
    for(i = 0; i < n; ++i) 
     fprintf(f, "%c", c); 
} 

int main() { 
    most_generic_printN(10, 'a', stdout); 
    return 0; 
} 

を、stdoutは標準出力ストリームですこれはあなたがコンソールとして見るものです。これをファイルなどにリダイレクトすることができます。それと一緒に遊ぶ!

+0

OPにバッファを渡すようにする方法もあります(動的割り当てを避けるため)。 'printf'で一般化するために' FILE * 'を渡すことも可能です。 – StoryTeller

+0

確かに多くの変種があります。しかし、今のところ、これらの亜種は、それが見える十分な時間のためにOPを占有するでしょう。 – SenselessCoder

+0

バリエーションについての議論のためにドアを開けたのはあなたです: – StoryTeller

0

"Nは0になりますが、改行を印刷します。"

void print_lines(int n) 
{ 
    while (n --> 0) printf("\n"); 
} 
関連する問題