C 如何分配字符串值
我可以像下面的代码一样将人名输入到firstname字符串中吗C 如何分配字符串值,c,string,scanf,C,String,Scanf,我可以像下面的代码一样将人名输入到firstname字符串中吗 printf("First Name? "); scanf("%s", &firstname[11]); 是。这将输入存储在firstname中,从索引11开始。否。您不应该这样做。它是不安全的,方式完全相同 你应该这样做。(我假设您确实希望从字符位置11开始写入firstname,这就是&firstname[11]有。如果firstname的长度为11个字节,并且您希望从位置0开始写入,只需使用firstname并删除下
printf("First Name? ");
scanf("%s", &firstname[11]);
是。这将输入存储在
firstname
中,从索引11
开始。否。您不应该这样做。它是不安全的,方式完全相同
你应该这样做。(我假设您确实希望从字符位置11开始写入firstname
,这就是&firstname[11]
有。如果firstname
的长度为11个字节,并且您希望从位置0开始写入,只需使用firstname
并删除下面出现的各种11+
。)
如果你的反应是,这看起来像是背后的巨大痛苦,我只能说,欢迎来到C编程。事实上,所有这些对于在面对任意格式错误的输入时的健壮性来说都是必要的
您还应该反思,然后相应地重新设计数据库。(在这种情况下,最重要的是:人们不一定把自己的名字分为“first”和“last”以及“middle”两部分;许多人的名字需要超过10个字节来表示。)
编辑:示例代码中的错误现在应该全部更正。请原谅我在头脑中做记忆运算而不进行测试。对你的问题的简短回答是:是的,你可以 长长的答案(以及随之而来的问题) 名的声明是什么
filename
的第一个11
位置是什么
您是否试图将用户输入的长度限制为11
个字符,并且您认为这是可行的语法
我怀疑您试图将firstname
限制为最多11个字符。解决这个问题的方法是:
char firstname[12];
scanf("%11s", firstname);
然而,正如扎克所指出的,如果你有一个像“玫琳凯”这样的名字,这将是一个问题scanf
将在第一个空白处停止,您将得到一个只包含“Mary”的名字。更好的方法是使用fgets
fgets(firstname, 12, stdin);
如果一行中没有其他内容,这应该是可行的
如果您希望从文件中读取数据,并且一行中还有其他字段,那么您将不得不处理额外的复杂性。把你的名字、姓氏和年龄排成一行。您的输入文件可能类似于:
John, Deer, 59
Mary Kay, Smith, 42
约翰,鹿,59岁
玫琳凯,史密斯,42岁
如果输入文件包含上述数据,则不能使用fgets
使用fgets(firstname,12,infle)来选择名字代码>。您必须使用fgets
读取整行,然后解析该行以提取所有相关数据。我使用的是c编程,您确定要从索引11开始吗?现在,我不确定它是从索引11开始还是只允许字段为11个空格。不过,请注意,用户可能很容易输入太多字符,导致缓冲区溢出。如果您想限制扫描的字符数,请将其转换为scanf
的格式字符串“现在,我不确定它是从索引11开始,还是只允许字段为11个空格”——那么您确实需要了解更多关于C编程的基础知识。我不认为OP真的希望存储到firstname+11中。。。我认为firstname只有11个字符(或者可能只有10个加NUL)。。。参见问题下方的注释。memcpy(&firstname[11],inbuf,n+1)
也f(inbuf[n-1]!='\n'…)
在n恰好为零时会导致问题。@wildplasser这也不对,因为n
包含换行符。尝试inbuf[n-1]='\0';strcpy(名字,inbuf)代码>否。fgets()可以在看到“\n”之前命中二进制NUL或EOF。@wildplasser??我确实重复了那个测试!如果您建议使用fgets
,我会对此进行投票,但任何scanf
函数都不应该被使用,句号。即使这种明显合理的使用也是有问题的,因为(a)您必须在两个地方写出缓冲区大小,(b)它在空白处停止,因此需要进一步努力才能清除尾随的换行,(c)它停止在空白处,因此会在名字中留下空格(例如“玫琳凯”)。@Zack,感谢您鼓励我扩展答案,以涵盖更多场景。
John, Deer, 59
Mary Kay, Smith, 42