Как вы можете вводить пробелы с помощью 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() разрешить пробелы

+118
источник поделиться
13 ответов

Люди (и особенно новички) никогда не должны использовать 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;
}
+167
источник

Try

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

Надеюсь, что это поможет.

+114
источник
другие ответы

Связанные вопросы


Похожие вопросы

В этом примере используется инвертированный scanset, поэтому 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;
}
+45
источник

Вы можете использовать это

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

DEMO

+21
источник

Не используйте 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);
}
+7
источник

Вы можете использовать функцию fgets() для чтения строки или использовать scanf("%[^\n]s",name);, поэтому чтение строки прекратится при встрече с символом новой строки.

+6
источник

getline()

Теперь часть POSIX, не более-менее.

Он также заботится о проблеме выделения буфера, о которой вы спрашивали ранее, хотя вам нужно позаботиться о free о том, как использовать память.

+4
источник

Если кто-то все еще смотрит, вот что для меня работало - чтобы прочитать произвольную длину строки, включая пробелы.

Благодаря многим плакатам в Интернете для совместного использования этого простого и элегантного решения. Если он работает, кредит идет к ним, но любые ошибки мои.

char *name;
scanf ("%m[^\n]s",&name);
printf ("%s\n",name);
+4
источник

Вы можете использовать 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;
}

Как это работает? Когда пользователь вводит символы со стандартного ввода, они будут сохраняться в переменной string до первого пустого пространства. После этого остальная часть записи останется во входном потоке и дождитесь следующего scanf. Затем у нас есть цикл for, который принимает char на char из входного потока (до \n) и отбрасывает их до конца переменной string, формируя таким образом полную строку, такую ​​же, как пользовательский ввод с клавиатуры.

Надеюсь, это поможет кому-то!

+1
источник

В то время как вы действительно не должны использовать 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;
}
0
источник
enter code here
#include<stdio.h>
int main()
{
   char *c,*p;
   scanf("%[^\n]s",c);
   p=c;
   printf("%s",p);
   return 0;
 }
0
источник

Я искал этот вопрос и обнаружил, что все это путают, этому нужен только этот простой код

for(i=0; row[i-1] != '\n'; i++){
    scanf("%c", &row[i]);
}

это может дать вам целую строку, которую пользователь вводил до конца, как [ENTER]

-1
источник

Используйте следующий код для чтения строки с пробелами:
scanf("[%s/n]",str_ptr);

-3
источник

Посмотрите другие вопросы по меткам или Задайте вопрос