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' にはなりません 、現時点では、次のように結果は正しいです。
出力に空白行が残らなくなりました。