stdinからの複数の文字列を一時変数に格納しようとしています。
各文字列は、改行文字の後に入力されます。
これは私の試みです:
#include <stdio.h>
int main() {
for (int i=0; i<10; i++) {
char string;
scanf("%s\n", &string);
printf("%d\n", i);
}
}
forループは意図したとおりに実行されず、2回だけループし、scanfがループに干渉しているようです。
stdin:
test
test
stdout:
7631717
stdinからの入力/各行をchar
固定のサイズ/長さなしで変数に動的に格納する方法はありますか?
文字列を読み取る特定のサイズに制限されないように、修飾子 'm'を使用できます。
char * p;
if (scanf("%ms", &p) == 1) {
...use p;
free(p); /* when stop to be usefull
}
の男から scanf
:
オプションの「m」文字。これは文字列変換(%s、%c、%[)で使用され、入力を保持するために対応するバッファーを割り当てる必要性から呼び出し元を解放します。代わりに、scanf()は十分なサイズのバッファーを割り当て、アドレスを割り当てます。このバッファの対応するポインタ引数へのポインタ。これはchar *変数へのポインタである必要があります(この変数は呼び出し前に初期化する必要はありません)。その後、呼び出し元は、このバッファーが不要になったときに、このバッファーを解放(3)する必要があります。
前の方法では、「単語」を赤くして、先頭のスペース( ''、改行、タブ...)を削除して完全な行を読み取ることができます。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * p;
if (scanf(" %m[^\n]", &p) == 1) {
printf("'%s'\n", p);
free(p);
}
else
puts("error (EOF...)");
return 0;
}
コンパイルと実行:
/tmp % gcc -Wall c.c
/tmp % ./a.out
aze qsd
'aze qsd'
/tmp % ./a.out < /dev/null
error (EOF...)
/tmp %
そのまま全行を読み取るための修飾子(posix ...ではない)がない場合は、次のことができます。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * p = malloc(1);
size_t len = 0;
int c;
while (((c = getchar()) != '\n') && (c != EOF)) {
p = realloc(p, len+1);
if (p == NULL) {
puts("not enough memory");
return -1;
}
p[len++] = c;
}
p[len] = 0;
printf("'%s'\n", p);
free(p);
return 0;
}
コンパイルと実行:
/tmp % gcc -Wall c.c
/tmp % ./a.out
aze qsd
' aze qsd'
/tmp % ./a.out < /dev/null
''
/tmp %
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加