IT

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

lottoking 2020. 7. 18. 09:40
반응형

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()( over-플로우 방지 버퍼)로 입력 입력을 문자열 취득하고 sscanf()그것을 평가. 하지 않고 user-파싱가 입력 입력 한 것을 원하기 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메모리를 관리해야하지만 이전에 요청한 버퍼 할당 문제도 처리 합니다.


누군가가 여전히 찾고 있다면 공백을 포함하여 임의의 길이의 문자열을 읽는 것이 저에게 효과적이었습니다.

이 간단하고 우아한 솔루션을 공유 한 웹상의 많은 포스터 덕분입니다. 작동하면 신용이 그들에게 전달되지만 오류는 내 것입니다.

char *name;
scanf ("%m[^\n]s",&name);
printf ("%s\n",name);

scanf약간의 트릭으로이 목적으로 사용할 수 있습니다 . 실제로 사용자가 Enter ( \n)를 누를 때까지 사용자 입력을 허용해야합니다 . 공백을 포함한 모든 문자를 고려 합니다 . 예를 들면 다음과 같습니다.

int main()
{
  char string[100], c;
  int i;
  printf("Enter the string: ");
  scanf("%s", string);
  i = strlen(string);      // length of user input till first space
  do
  {
    scanf("%c", &c);
    string[i++] = c;       // reading characters after first space (including it)
  } while (c != '\n');     // until user hits Enter
  string[i - 1] = 0;       // string terminating
return 0;
}

어떻게 작동합니까? 사용자가 표준 입력에서 문자를 입력하면 첫 번째 공백까지 문자열 변수에 저장됩니다 . 그 후 나머지 항목은 입력 스트림에 남아 있으며 다음 스캔을 기다립니다. 다음으로, for입력 스트림 (till \n) 에서 문자 단위로 문자를 가져 와서 문자열 변수 끝에 추가 하여 키보드에서 사용자 입력과 동일한 완전한 문자열을 형성 하는 루프가 있습니다.

이것이 누군가를 도울 수 있기를 바랍니다!


당신이 정말로 사용하지 말아야하는 동안 scanf()이 있기 때문에, 이런 종류의 훨씬 더 같은 호출 gets()또는 getline()그것을 할 수 있습니다 :

#include <stdio.h>

char* scan_line(char* buffer, int buffer_size);

char* scan_line(char* buffer, int buffer_size) {
   char* p = buffer;
   int count = 0;
   do {
       char c;
       scanf("%c", &c); // scan a single character
       // break on end of line, string terminating NUL, or end of file
       if (c == '\r' || c == '\n' || c == 0 || c == EOF) {
           *p = 0;
           break;
       }
       *p++ = c; // add the valid character into the buffer
   } while (count < buffer_size - 1);  // don't overrun the buffer
   // ensure the string is null terminated
   buffer[buffer_size - 1] = 0;
   return buffer;
}

#define MAX_SCAN_LENGTH 1024

int main()
{
   char s[MAX_SCAN_LENGTH];
   printf("Enter a string: ");
   scan_line(s, MAX_SCAN_LENGTH);
   printf("got: \"%s\"\n\n", s);
   return 0;
}

/*reading string which contains spaces*/
#include<stdio.h>
int main()
{
   char *c,*p;
   scanf("%[^\n]s",c);
   p=c;                /*since after reading then pointer points to another 
                       location iam using a second pointer to store the base 
                       address*/ 
   printf("%s",p);
   return 0;
 }

참고 URL : https://stackoverflow.com/questions/1247989/how-do-you-allow-spaces-to-be-entered-using-scanf

반응형