

C言語で以下の様な結果となる文を作りたいのですが、うまくできないので教えてもらえると助かります。

**期待する結果:**

[code]

    A
    AB
    ABC
    ABCD
    
[/code]

**現状のソースコード:**

[code]

    #include <stdio.h>
    int main(void)
    {
        int i, j;
        for (i = 65; i <= 90; i++)
        {
            for (j = 1; j <= i; j++)
                
                printf("%c",i);
                
            printf("\n");
        }
        return (0);
    }
    
[/code]


CC BY-SA 4.0
2020-11-29T06:47:15.343
72268
2021-09-16T07:29:53.740
2021-09-16T07:29:53.740
3060
42681
question
c
C言語でループを使ってアルファベットを1文字ずつ表示させたい


65 が 'A' というのも 'A' ～ 'Z' が連続しているのも ASCII の話です。  
処理系依存で書くのは避けた方が良いと思います。  
今回の仕様は printf 関数の %s 精度指定が使いやすいと思います。

[code]

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        const char* ps = "ABCD";
    
        int len = strlen(ps);
        for (int i = 0; i < len; ++i) {
            char format[10] = "";
            snprintf(format, sizeof format, "%%.%ds\n", i + 1);
            printf(format, ps);
        }
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2020-11-29T07:05:52.463
72269
2020-11-29T07:05:52.463
41756
72268
answer


以下は `printf(3)` の `%.*s`(width precision) 形式を使う方法です。

[code]

    #include <stdio.h>
    
    int main(void) {
      char string[] = "ABCD";
      int sz = sizeof(string);
    
      for(int i=1;i<sz;i++){
        printf("%.*s\n", i, string);    
      }
    
      return 0;
    }
    
[/code]

**printf(3)**

> **Precision**
>
> An optional precision, in the form of a period ('.') followed by an optional
> decimal digit string. Instead of a decimal digit string one may write "*" or
> "*m$" (for some decimal integer m) to specify that the precision is given in
> the next argument, or in the m-th argument, respectively, which must be of
> type int.  
>  :
>
> ... the maximum number of characters to be printed from a string for s and S
> conversions.


CC BY-SA 4.0
2020-11-29T07:57:44.723
72270
2020-11-29T07:57:44.723
72268
answer


できる限り題意に沿って、規格厳密一致を狙うと

\- 元コードは `A` から `Z` までを扱いたがっている様子  
\- ASCII では `'A'` から `'Z'` が連続しているけど
[EBCDIC](https://ja.wikipedia.org/wiki/EBCDIC)/EBCDIK では連続していない  
\- 二重ループを含める

EBCDIK 系でも期待通りかつ簡単にするなら文字は列挙して添え字を変化させるべし。 [c](/questions/tagged/c "'c'
のタグが付いた質問を表示") ではループは `0` から始めるのが慣習なので、外側のループはおそらく `for (i=0; i<26; ++i)`
内側のループは今注目中の `i` より１文字多く出力したいわけなので `i+1` にするか不等号にイコールを付けるかのどっちかで、例えば

[code]

    #include <stdio.h>
    #define elementsof(n) (sizeof(n)/sizeof(0[n]))
    int main() {
        const char alphabets[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // try resize me
        // must exclude terminating '\0'
        for (int i = 0; i < elementsof(alphabets)-1; ++i) {
            for (int j = 0; j <= i; ++j) {
                putchar(alphabets[j]);
            }
            putchar('\n');
        }
    }
    
[/code]

まあ慣れてくると `alphabets[]` が頭に浮かんだ時点で二重ループは不要ってのがすぐ思いつくっス。

* * *

提示ソースコードが期待通りに動かない原因は内側ループ内では `printf("%c",i);` の `i`
が変化していないので同じ文字が出続けているのと、外側ループは「終了位置」を動かしているのに内側ループで「開始位置」が正しくないことによります。


CC BY-SA 4.0
2020-11-30T00:56:36.960
72280
2020-11-30T00:56:36.960
8589
72268
answer


`A`から何文字分出力するかがポイントですね。

[code]

    #include <stdio.h>
    int main(void)
    {
        for (int i = 1; i <= 26; i++)
        {
            for (int j = 0; j < i; j++){
                 printf("%c",'A' + j);
            }
    
            printf("\n");
        }
        return (0);
    }
    
[/code]

## 注意事項

実行環境(文字コード)によっては`A`の隣が`B`とは限らないので他の方のようにしたほうがいいと思います。  
授業的には上のコードが適切だと思いますが。

[code]

    // 環境によらないコード
    #include <stdio.h>
    int main(void)
    {
        const char alphabets[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        
        for (int i = 1; i <= 26; i++)
        {
            for (int j = 0; j < i; j++){
                 printf("%c", alphabets[j]);
            }
    
            printf("\n");
        }
        return (0);
    }
    
[/code]


CC BY-SA 4.0
2021-09-16T07:12:19.767
82532
2021-09-16T07:12:19.767
40856
72268
answer