使用以下代码:
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 #include #include /* 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 memoryn"); 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] = ' '; /* 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 int main (int argc, char const *argv[]) { char name[20]; scanf("%[^n]s",name); printf("%sn", 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()
来读取字符串而不指定字段宽度。 您还应该检查错误的返回值:
#include #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 linen", stderr); return 1; } printf("Hello %s. Nice to meet you.n", name); }
或者,使用fgets()
:
#include #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 errorn", stderr); return 1; } // don't print newline printf("Hello %.*s. Nice to meet you.n", strlen(name) - 1, name); }
您可以使用fgets()
函数读取字符串或使用scanf("%[^n]s",name);
所以字符串读取将在遇到换行符时终止。
getline()
现在是POSIX的一部分,尽管如此。
它还会处理您之前询问的缓冲区分配问题,尽管您必须free
处理内存。
如果有人还在寻找,那么这对我有用 – 读取包含空格的任意长度的字符串。
感谢网上的许多海报分享这个简单而优雅的解决方案。 如果它起作用,则归功于他们,但任何错误都是我的。
char *name; scanf ("%m[^n]s",&name); printf ("%sn",name);
您可以通过一个小技巧将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; }
这是怎么回事? 当用户从标准输入中输入字符时,它们将存储在字符串变量中,直到第一个空格。 之后,其余的条目将保留在输入流中,并等待下一个scanf。 接下来,我们有一个for
循环,它从输入流中获取char(直到n
)并将它们连接到字符串变量的结尾 ,从而形成与键盘用户输入相同的完整字符串。
希望这会对某人有所帮助!
虽然你真的不应该使用scanf()
来做这类事情,因为有更好的调用,比如gets()
或getline()
,它可以完成:
#include 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"nn", s); return 0; }
使用以下代码读取带空格的字符串:
scanf("[%s/n]",str_ptr);
以上就是c/c++开发分享如何使用scanf输入空格?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522504.html