programing

scanf를 사용하여 공백 입력을 허용하려면 어떻게 해야 하는가?

prostudy 2022. 5. 16. 21:00
반응형

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

그게 도움이 되길 바래.

이 예에서는 반전된 스캔 세트를 사용하므로 스캔프는 '\n'이라는 뉴라인이 나타날 때까지 값을 계속 입력하므로 공간도 함께 저장된다.

#include <stdio.h>

int main (int argc, char const *argv[])
{
    char name[20];

    // get up to buffer size - 1 characters (to account for NULL terminator)
    scanf("%19[^\n]", 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);

데모

getline()

이제 POSIX의 일부분이지, 전혀 그렇지 않아.

앞서 문의한 버퍼 할당 문제도 해결해야 하지만 해결한다.free기억을 더듬어

사용하지 마십시오.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);따라서 문자열 읽기는 새로운 줄 문자를 만나면 종료된다.

만약 누군가가 여전히 찾고 있다면, 여기 내가 공간을 포함한 임의의 길이의 줄을 읽는 것이 효과가 있었다.

이 간단하고 우아한 솔루션을 공유하기 위한 웹 상의 많은 포스터들 덕분에.그것이 효과가 있다면 그들에게 득이 되지만 어떤 실수는 나의 것이다.

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로 가져가는 )는 har를 char로 한다.\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

반응형