C 在小型数据库程序中存储地址
我正在编写一个小程序,其中包含一个按以下结构组织的数据库:C 在小型数据库程序中存储地址,c,C,我正在编写一个小程序,其中包含一个按以下结构组织的数据库: typedef struct { char fname[20]; char lname[20]; char phone[12]; char address[50]; } database; 当我要求输入一个条目的所有值时,我按如下方式操作(程序开始时var保存为0): 问题是,我希望最后一个字符串输入(地址)能够存储带有空格的完整句子。当我输入一些东西时,比如安德烈斯·格拉+15551234 55555
typedef struct {
char fname[20];
char lname[20];
char phone[12];
char address[50];
} database;
当我要求输入一个条目的所有值时,我按如下方式操作(程序开始时var保存为0):
问题是,我希望最后一个字符串输入(地址)能够存储带有空格的完整句子。当我输入一些东西时,比如安德烈斯·格拉+15551234 55555 AB Ave.,UT。它将只保存在列表[save]中。地址为55555,其余内容将保留存储以供下次输入,从而导致存储差异
如何在address struct元素中保存包含空格的完整句子
注意:我还尝试单独使用地址对%s进行额外扫描,但也不起作用
如果我使用国家而不是地址,程序运行良好 尝试使用
scanf("%s %s %s %49[0-9a-zA-Z ]",
&list[save].fname,
&list[save].lname,
&list[save].phone,
&list[save].address
);
我希望这有帮助。尝试使用
scanf("%s %s %s %49[0-9a-zA-Z ]",
&list[save].fname,
&list[save].lname,
&list[save].phone,
&list[save].address
);
我希望这有帮助。尝试使用
scanf("%s %s %s %49[0-9a-zA-Z ]",
&list[save].fname,
&list[save].lname,
&list[save].phone,
&list[save].address
);
我希望这有帮助。尝试使用
scanf("%s %s %s %49[0-9a-zA-Z ]",
&list[save].fname,
&list[save].lname,
&list[save].phone,
&list[save].address
);
我希望这能有所帮助。最短路径:使用
作为分隔符和strok()
来分割一个大字符串。或者使用flex和bison,但绝对不要使用scanf。scanf只适合大学练习,即使在那里,它的适用性也值得怀疑。我还是个初学者,所以我不知道用什么来代替scanf,也许gets是个不错的选择?@AndresGuerra:使用gets()
是个非常糟糕的选择;使用fgets()
可能是一个明智的选择,可能与sscanf()
结合使用。不幸的是,scanf()
这么早就被教授了,因为尽管琐碎的案例是可行的,但很难正确使用。例如,您可以使用“…%49[^\n]”
读取多达49个非换行字符作为地址字段(当然,第五十个字符将用于null)。但这并不是小事,前面的空格也很重要,换行符留在输入流中,如果使用scanf()
,这可能会导致混淆。最短的方法:使用
作为分隔符和strok()
来分割一个大字符串。或者使用flex和bison,但绝对不要使用scanf。scanf只适合大学练习,即使在那里,它的适用性也值得怀疑。我还是个初学者,所以我不知道用什么来代替scanf,也许gets是个不错的选择?@AndresGuerra:使用gets()
是个非常糟糕的选择;使用fgets()
可能是一个明智的选择,可能与sscanf()
结合使用。不幸的是,scanf()
这么早就被教授了,因为尽管琐碎的案例是可行的,但很难正确使用。例如,您可以使用“…%49[^\n]”
读取多达49个非换行字符作为地址字段(当然,第五十个字符将用于null)。但这并不是小事,前面的空格也很重要,换行符留在输入流中,如果使用scanf()
,这可能会导致混淆。最短的方法:使用
作为分隔符和strok()
来分割一个大字符串。或者使用flex和bison,但绝对不要使用scanf。scanf只适合大学练习,即使在那里,它的适用性也值得怀疑。我还是个初学者,所以我不知道用什么来代替scanf,也许gets是个不错的选择?@AndresGuerra:使用gets()
是个非常糟糕的选择;使用fgets()
可能是一个明智的选择,可能与sscanf()
结合使用。不幸的是,scanf()
这么早就被教授了,因为尽管琐碎的案例是可行的,但很难正确使用。例如,您可以使用“…%49[^\n]”
读取多达49个非换行字符作为地址字段(当然,第五十个字符将用于null)。但这并不是小事,前面的空格也很重要,换行符留在输入流中,如果使用scanf()
,这可能会导致混淆。最短的方法:使用
作为分隔符和strok()
来分割一个大字符串。或者使用flex和bison,但绝对不要使用scanf。scanf只适合大学练习,即使在那里,它的适用性也值得怀疑。我还是个初学者,所以我不知道用什么来代替scanf,也许gets是个不错的选择?@AndresGuerra:使用gets()
是个非常糟糕的选择;使用fgets()
可能是一个明智的选择,可能与sscanf()
结合使用。不幸的是,scanf()
这么早就被教授了,因为尽管琐碎的案例是可行的,但很难正确使用。例如,您可以使用“…%49[^\n]”
读取多达49个非换行字符作为地址字段(当然,第五十个字符将用于null)。但这并不是微不足道的,它前面的空间至关重要,而且换行符留在输入流中,如果您使用scanf()
,这可能会导致混淆。%s%s%49[0-9a-zA-Z]s
中的尾随s
是虚假的%[…]
是一个完整的转换规范,s
与文本s
匹配(但仅当前面有与扫描集匹配的49个字符时才会这样做)。当s
是格式字符串中的最后一个字符时,您永远不会知道它不匹配,但是,例如,在它之后添加一个数字转换,您将永远不会得到所有数据。@JonathanLeffler感谢您指出后面的s
。更正。@Amit。谢谢你的建议,很有效。然而,正如我在代码中所注意到的,还有一件事,它只允许我输入a-z,a-z,0-9中的字符。像这样的角色呢。或者——或者#或者?如果您能指出我需要的范围,我将不胜感激