C言語キーボードの入力文字列 入力文字列の小文字から大文字への出力とscanfの小さな問題解決

1. ブロガーが C 言語を学習していたとき、C 言語の細部にあまり注意を払っていなかったため、後から質問されてもしばらく答えられなかった、いわゆる基礎が弱い状態です。たとえば、今回はクラスメートに scanf キーボード入力に関する小さな問題について尋ねましたが、しばらく悩んだ後、それでも問題を理解できました。

2. 難しい作業はせずに、キーボードに小文字の文字列を入力し、それを大文字に変換して出力します。コードは次のとおりです。

#include <stdio.h>

int main()
{
    char str[10];
    int i,n;
    printf("输入长度n:");
    scanf("%d",&n);
    printf("输入字符串长度%d:",n);
    for ( i = 0; i < n; i++)
    {
        scanf("%c",&str[i]);
        if (str[i]>='a' && str[i]<='z')
        {
            str[i] = str[i]-32;
        }
        
    }
    for ( i = 0; i < n; i++)
    {
        printf("%c",str[i]);
    }
    return 0;
    
}

次に、入力および出力を行った結果は次のようになります。

問題は、 が AS のみを出力するのはなぜでしょうか。多くの子供たちは混乱するかもしれません

でも、賢い友達なら簡単に見つけられるでしょう?このASと入力文字列の間に空行、つまり下図の赤枠部分が空行として出力されるのですが、これはなぜでしょうか?

このファンタジーなことについては、コードの内容から始める必要があります。

コードでは、まず長さ n を入力してから、文字列を入力します。はい、ここで問題が発生します。

長さ n を入力したら、Enter キーを押しますね。つまり、 2 回 2回 入力します(n は 1 回入力され、Enter キーは 1 回カウントされます)< /a > のですが、どうすれば解決できますか? 空行を出力(実際には改行を出力)してから AS を出力する、出力時に上記の結果が表示されるので、 str[0] の値は です。 39;\n'、str[1] の値は ' a'、str[2] の値は 's' に属しており、次の scanf は %c として受け取られるため、前の scanf に n を入力して Enter キーを押します。キャリッジ リターンは次の最初の for ループの str[0] を受信するため、Carriage Enter (\n) は文字 の入力で終わることは誰もが知っています (キャリッジ リターンもspace) ですが、見落としている可能性があります。 のスペースと 、もちろん、scanf が

3. 2 つの解決策

(1) キャリッジリターンを受け取るために scanf を追加します。コードは次のとおりです。 scanf("%c") という行を追加しました。 ;,& m);、n を入力した後に復帰を受け取るために使用されます

#include <stdio.h>

int main()
{
    char str[10],m;
    int i,n;
    printf("输入长度n:");
    scanf("%d",&n);
    printf("输入字符串长度%d:",n);
    scanf("%c",&m);
    for ( i = 0; i < n; i++)
    {
        scanf("%c",&str[i]);
        if (str[i]>='a' && str[i]<='z')
        {
            str[i] = str[i]-32;
        }
        
    }
    for ( i = 0; i < n; i++)
    {
        printf("%c",str[i]);
    }
    return 0;
    
}

(2) %c の前にスペースを追加します。コードは次のようになります。

#include <stdio.h>

int main()
{
    char str[10];
    int i,n;
    printf("输入长度n:");
    scanf("%d",&n);
    printf("输入字符串长度%d:",n);
    for ( i = 0; i < n; i++)
    {
        scanf(" %c",&str[i]);
        if (str[i]>='a' && str[i]<='z')
        {
            str[i] = str[i]-32;
        }
        
    }
    for ( i = 0; i < n; i++)
    {
        printf("%c",str[i]);
    }
    return 0;
    
}

scanf(" %c",&str[i]); の %c の前にスペースがあるのはなぜですか? scanf ではたとえば、scanf(" %c % c %c",&n)、この場合、入力はスペースで終わりませんが、これら 3 つの入力区切り文字としてスペースが使用されます。

したがって、%c の前にスペースを追加することは、n 文字から n 文字までの n 文字を入力することを意味します。入力はスペースで区切ってください(復帰もスペースです) < a i=2> なので、%c はキャリッジ リターンを読み取らないため、str[0] は '\n' にはなりません 、現時点では、次のように結果は正しいです。

出力に空白行が残らなくなりました。

おすすめ

転載: blog.csdn.net/m0_59799878/article/details/134651253