Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在小型数据库程序中存储地址_C - Fatal编程技术网

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中的字符。像这样的角色呢。或者——或者#或者?如果您能指出我需要的范围,我将不胜感激