入力が空になるまで入力から読み取り、ユーザーがEnterキーを押すまで、Cで作業するように求められました。これを行う場合:
scanf("%2000s %2000s", a, b);
1番目のルールに従いますが、2番目のルールには従いません。
書く場合:
私は頭が良いです
私が得るものは次と同等です:
a = "I";
b = "am";
ただし、次のようになります。
a = "I";
b = "am smart";
私はすでに試しました:
scanf("%2000s %2000[^\n]\n", a, b);
そして
scanf("%2000s %2000[^\0]\0", a, b);
1つ目は、ユーザーが押すのを待ちます Ctrl+D (EOFを送信するため)、それは私が望むものではありません。 2番目では、コンパイルされません。コンパイラによると:
警告:「%[」形式の終了「]」はありません
これを解決する良い方法はありますか?
scanf
(およびいとこ)には少し奇妙な特徴があります。フォーマット文字列(スキャンセットの外側)の空白は、入力の空白の任意の量と一致します。少なくともデフォルトの "C"ロケールでは、改行は空白として分類されます。
これは、末尾の'\n'
は、a改行だけでなく、後続の空白も一致させようとしています。入力の終了を通知するか、空白以外の文字を入力するまで、一致とはみなされません。
これに対処するには、通常、次のようなことを行います。
scanf("%2000s %2000[^\n]%c", a, b, c);
if (c=='\n')
// we read the whole line
else
// the rest of the line was more than 2000 characters long. `c` contains a
// character from the input, and there's potentially more after that as well.
scanf("%2000s %2000[^\n]", a, b);
次のようなgetcharとwhileを使用します
while(x = getchar())
{
if(x == '\n'||x == '\0')
do what you need when space or return is detected
else
mystring.append(x)
}
擬似コードを書いたのに申し訳ありませんが、しばらくの間C言語を使用できません。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main(void)
{
int i = 0;
char *a = (char *) malloc(sizeof(char) * 1024);
while (1) {
scanf("%c", &a[i]);
if (a[i] == '\n') {
break;
}
else {
i++;
}
}
a[i] = '\0';
i = 0;
printf("\n");
while (a[i] != '\0') {
printf("%c", a[i]);
i++;
}
free(a);
getch();
return 0;
}
遅すぎますが、このアプローチを試すこともできます。
#include <stdio.h>
#include <stdlib.h>
int main() {
int i=0, j=0, arr[100];
char temp;
while(scanf("%d%c", &arr[i], &temp)){
i++;
if(temp=='\n'){
break;
}
}
for(j=0; j<i; j++) {
printf("%d ", arr[j]);
}
return 0;
}
宿題の問題のようですね。 scanf()は、問題に使用する間違った関数です。 getchar()またはgetch()をお勧めします。
注:これは宿題のように見えるので、意図的に問題を解決するのではなく、単に正しい方向に向けるだけです。