你如何允许使用scanfinput空格?
使用下面的代码:
char *name = malloc(sizeof(char) + 256); printf("What is your name? "); scanf("%s", name); printf("Hello %s. Nice to meet you.\n", name);
用户可以input他们的名字,但是当他们input一个像Lucas Aardvark
这样的空间的名字时, scanf()
只会截断Lucas
之后的所有内容。 我如何使scanf()
允许空格
人们( 特别是初学者)不应该使用scanf("%s")
或者gets()
或者没有缓冲区溢出保护function的其他函数,除非你确定input总是具有特定的格式甚至没有)。
请记住, scanf
代表“扫描格式化”,并且有比用户input的数据更less的格式。 如果您完全控制input数据格式,但通常不适合用户input,则这是理想select。
使用fgets()
( 具有缓冲区溢出保护)将您的input转换为string,然后使用sscanf()
对其进行求值。 既然你只是想要用户input而不parsing,在这种情况下你并不需要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' – 换行符,所以空间也被保存了
#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);
DEMO
不要使用scanf()
来读取string而不指定字段宽度。 您还应该检查错误的返回值:
#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()
函数读取string或使用scanf("%[^\n]s",name);
所以string读取将在遇到换行符时终止。
getline()
现在是POSIX的一部分,无所不能。
它也照顾了你之前问过的缓冲区分配问题,尽pipe你必须注意free
内存。
如果有人还在看,这是我的工作 – 读取任意长度的string,包括空格。
感谢networking上的许多海报,分享这个简单而优雅的解决scheme。 如果有效的话,他们的信贷,但任何错误是我的。
char *name; scanf ("%m[^\n]s",&name); printf ("%s\n",name);
你可以使用scanf
来达到这个目的。 其实,你应该允许用户input,直到用户input( \n
)。 这将考虑每个angular色,包括空间 。 这里是例子:
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; }
这是如何工作的? 当用户从标准input中input字符时,它们将被存储在stringvariables中,直到第一个空格为止。 之后,其余的input将保持在inputstream中,并等待下一个scanf。 接下来,我们有一个for
循环,从inputstream(直到\n
)接受字符char,并将它们添加到stringvariables的结尾 ,从而形成一个与用户从键盘input相同的完整string。
希望这会帮助别人!
虽然你真的不应该使用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; }
使用下面的代码来读取带空格的string:
scanf("[%s/n]",str_ptr);