如何使用 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()允许空格

442503 次浏览

试试看

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

希望能帮上忙。

人们(和 尤其是初学者)不应该使用 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;
}

不要在没有指定字段宽度的情况下使用 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);
}

getline()

现在是 POSIX 的一部分。

它还解决了前面提到的缓冲区分配问题,但是必须解决 freeing 内存的问题。

这个例子使用了一个反向的扫描集,因此 Scanf 一直接受值,直到遇到 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;
}

可以使用 fgets()函数读取字符串或使用 scanf("%[^\n]s",name);,这样字符串读取将在遇到换行符时终止。

你可以用这个

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,并使用一些小技巧。实际上,应该允许用户输入,直到用户点击 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循环,它从输入流(直到 \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;
}

如果有人还在查看,下面是对我有效的方法——读取包括空格在内的任意长度的字符串。

感谢在网上分享这个简单和优雅的解决方案的许多海报。 如果成功的话,功劳归他们,但任何错误都是我的。

char *name;
scanf ("%m[^\n]s",&name);
printf ("%s\n",name);
/*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;
}