Kre*_*dns 121 c string whitespace printf scanf
使用以下代码:
char *name = malloc(sizeof(char) + 256);
printf("What is your name? ");
scanf("%s", name);
printf("Hello %s. Nice to meet you.\n", name);
Run Code Online (Sandbox Code Playgroud)
用户可以输入他们的名字,但是当他们输入一个像空格一样的名字时Lucas Aardvark,scanf()只需切断后面的所有内容Lucas.如何设置scanf()允许空格
pax*_*blo 171
人们(尤其是初学者)不应该使用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;
}
Run Code Online (Sandbox Code Playgroud)
Kel*_*ron 119
尝试
char str[11];
scanf("%10[0-9a-zA-Z ]", str);
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
SVA*_*SVA 49
此示例使用反向扫描集,因此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;
}
Run Code Online (Sandbox Code Playgroud)
Vit*_*.us 21
你可以用它
char name[20];
scanf("%20[^\n]", name);
Run Code Online (Sandbox Code Playgroud)
或这个
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);
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
或者,使用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);
}
Run Code Online (Sandbox Code Playgroud)
小智 5
如果有人仍在寻找,这对我有用 - 读取任意长度的字符串(包括空格)。
感谢网络上的许多海报分享这个简单而优雅的解决方案。如果成功的话,功劳归于他们,但任何错误都是我的。
char *name;
scanf ("%m[^\n]s",&name);
printf ("%s\n",name);
Run Code Online (Sandbox Code Playgroud)