[c] scanf를 사용하여 공백을 어떻게 입력 할 수 있습니까?

다음 코드를 사용하십시오.

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;
}


답변

시험

char str[11];
scanf("%10[0-9a-zA-Z ]", str);

희망이 도움이됩니다.


답변

이 예에서는 반전 스캔 셋을 사용하므로 scanf는 ‘\ n’-줄 바꿈이 나타날 때까지 값을 계속 가져 와서 공백도 저장됩니다.

#include <stdio.h>

int main (int argc, char const *argv[])
{
    char name[20];
    scanf("%[^\n]s",name);
    printf("%s\n", name);
    return 0;
}


답변

이것을 사용할 수 있습니다

char name[20];
scanf("%20[^\n]", name);

아니면 이거

void getText(char *message, char *variable, int size){
    printf("\n %s: ", message);
    fgets(variable, sizeof(char) * size, stdin);
    sscanf(variable, "%[^\n]", variable);
}

char name[20];
getText("Your name", name, 20);

데모


답변

scanf()필드 너비를 지정하지 않고 문자열을 읽는 데 사용하지 마십시오 . 또한 반환 값에 오류가 있는지 확인해야합니다.

#include <stdio.h>

#define NAME_MAX    80
#define NAME_MAX_S "80"

int main(void)
{
    static char name[NAME_MAX + 1]; // + 1 because of null
    if(scanf("%" NAME_MAX_S "[^\n]", name) != 1)
    {
        fputs("io error or premature end of line\n", stderr);
        return 1;
    }

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

또는 다음을 사용하십시오 fgets().

#include <stdio.h>

#define NAME_MAX 80

int main(void)
{
    static char name[NAME_MAX + 2]; // + 2 because of newline and null
    if(!fgets(name, sizeof(name), stdin))
    {
        fputs("io error\n", stderr);
        return 1;
    }

    // don't print newline
    printf("Hello %.*s. Nice to meet you.\n", strlen(name) - 1, name);
}


답변

fgets()함수를 사용 scanf("%[^\n]s",name);하여 문자열을 읽 거나 줄 바꿈 문자가 발생하면 문자열 읽기가 종료되도록 사용할 수 있습니다.


답변

getline()

이제 POSIX의 일부입니다.

또한 free메모리를 관리해야하지만 이전에 요청한 버퍼 할당 문제도 처리 합니다.