1. ホーム
  2. c

[解決済み] scanfを使用してスペースを入力できるようにするにはどうすればよいですか?

2022-04-25 13:16:06

質問

以下のコードを使用します。

char *name = malloc(sizeof(char) + 256); 

printf("What is your name? ");
scanf("%s", name);

printf("Hello %s. Nice to meet you.\n", name);

ユーザーは自分の名前を入力することができますが、スペースが入った名前を入力すると Lucas Aardvark , scanf() の後をすべて切り捨てるだけです。 Lucas . どうすれば scanf() スペースを許可する

解決方法は?

人(と 特に を使うべきではありません。 scanf("%s") または gets() またはバッファオーバーフロー防止機能を持たないその他の関数は、入力が常に特定の形式であることが確実に分かっている場合(そしておそらくそうでない場合も)以外は、使用しないでください。

よりも覚えておいてください。 scanf は「スキャンフォーマット」の略で、「スキャンフォーマット」はほとんどありません。 以下 は、ユーザーが入力したデータよりもフォーマットされています。入力データの形式を完全に制御できる場合は理想的ですが、一般にユーザー入力には不向きです。

使用方法 fgets() (どの があります。 バッファオーバーフロー防止機能) を使って入力を文字列にし sscanf() で評価します。ユーザが入力した内容を解析せずに知りたいだけなので、実際には sscanf() この場合、とにかく

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Maximum name size + 1. */

#define MAX_NAME_SZ 256

int main(int argC, char *argV[]) {
    /* Allocate memory and check if okay. */

    char *name = malloc(MAX_NAME_SZ);
    if (name == NULL) {
        printf("No memory\n");
        return 1;
    }

    /* Ask user for name. */

    printf("What is your name? ");

    /* Get the name, with size limit. */

    fgets(name, MAX_NAME_SZ, stdin);

    /* Remove trailing newline, if there. */

    if ((strlen(name) > 0) && (name[strlen (name) - 1] == '\n'))
        name[strlen (name) - 1] = '\0';

    /* Say hello. */

    printf("Hello %s. Nice to meet you.\n", name);

    /* Free memory and exit. */

    free (name);
    return 0;
}