문제

다음 코드 사용 :

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'- Newline이 발생할 때까지 계속 값을 가져옵니다. 그래서 공간도 저장됩니다.

#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); 따라서 Newline 캐릭터를 만나면 문자열 읽기가 종료됩니다.

getline()

이제 POSIX의 일부, 그럼에도 불구하고.

또한 조기에 요청한 버퍼 할당 문제를 처리합니다. free메모리 ing.

누군가가 여전히보고 있다면, 여기에 나에게 효과가있는 것이 있습니다. 공백을 포함한 임의의 길이를 읽습니다.

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

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

당신은 사용할 수 있습니다 scanf 약간의 속임수 로이 목적을 위해. 실제로 사용자가 입력 할 때까지 사용자 입력을 허용해야합니다 (\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;
}

어떻게 작동합니까? 사용자가 표준 입력에서 문자를 입력하면 저장됩니다. 첫 번째 빈 공간까지 변수. 그 후, 나머지 항목은 입력 스트림에 남아 다음 Scanf를 기다립니다. 다음으로, 우리는 a for 입력 스트림에서 숯으로 숯을 취하는 루프 (틸트 \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;
 }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top