2012-08-03 209 views
3

我写了一段可以从键盘输入地址的代码。然而,我无法弄清楚如何我也许能在特殊字符,如连字符,冒号等看能否请您提出一些编辑下面我的代码:如何使用scanf函数读取特殊字符(标点符号,超音符,冒号)?

#include<stdio.h> 

main() 
{ 
     char address[80]; 


     printf("Enter address: "); 
     scanf("%[a-z | A-Z | 0-9]", address); //How may I include characters like hypen. 
     printf("\n\n%s\n\n", address); 
} 

输出我得到:

Enter Address: Plot No - 16, Palm Grooves, Nagpur - 440022, India 

Plot No 

没有逗号,没有连字符,也没有显示数字。

谢谢你的帮助和评论。

+0

如果您[知道](HTTP ://en.wikipedia.org/wiki/Scanf_format_string)你现有的代码做了什么,特别是'scanf(“%[az | AZ | 0-9',答案显而易见。 – bzlm 2012-08-03 11:36:20

+0

是的,我意识到我在做: scanf(“%[az | AZ | 0-9]”); 将允许键入所有的小字符AZ,大写字母AZ和数字0-9。我只是无知加载g特殊字符.... – Niteesh 2012-08-03 11:41:05

+0

这很好。但[对格式字符串没有什么特殊的字符](http://stackoverflow.com/a/11794936/7724)。 – bzlm 2012-08-03 11:54:12

回答

8

它们添加到可接受的字符列表一个接一个,像这样:

"%[a-z | A-Z | 0-9/,.-]" 

这里是this example on ideone

由于您使用scanf成有限大小的缓冲区,这是一个好主意,一个大小限制,以避免缓冲区溢出添加到格式说明:

char address[81]; // One extra character for padding 
printf("Enter address: "); 
scanf("%80[a-z | A-Z | 0-9/,.-]", address); // %80 limits the input 
printf("\n\n%s\n\n", address); 
+0

谢谢你这样详细的答案。 – Niteesh 2012-08-19 14:23:01

+0

这个答案需要注意。不是'“/ - ,”'像''a-z“'这样的范围? “特殊字符”包括'''''''''','''''''''',''''''在扫描集中具有它们的特性。使用''''会导致实现定义的行为。我会写我自己的答案,但我认为这个MOD的一些将是更好的方式去。你的想法? – chux 2016-02-13 15:54:24

+0

@chux谢谢!当你看到这样的错误,随时编辑他们没有问,因为它是绝对是错误,谢谢! – dasblinkenlight 2016-02-13 15:58:39