我可以执行类似下面代码的操作,将人名改为firstname字符串吗?
printf("First Name? ");
scanf("%s", &firstname[11]);
答案 0 :(得分:2)
是。这会将输入存储在firstname
中,从索引11
开始。
答案 1 :(得分:0)
不。你不应该这样做。它是不安全,方式与gets
is unsafe完全相同。
你应该做这样的事情。 (我假设你确实想要从firstname
开始写字符,这是&firstname[11]
所做的。如果firstname
长11个字节并且你想从头开始写位置0,您只需使用firstname
并删除下面11 +
的各种匹配项。)
char inbuf[80];
size_t n;
fputs("First Name? ", stdout);
fgets(inbuf, sizeof inbuf, stdin);
n = strlen(inbuf);
if (n == 0) {
fputs("No name entered\n", stderr);
exit(1);
}
if (inbuf[n-1] != '\n') {
fputs("Name too long\n", stderr);
exit(1);
}
inbuf[--n] = '\0';
if (n == 0) {
fputs("No name entered\n", stderr);
exit(1);
}
if (11 + n >= sizeof firstname) {
fputs("Name too long\n", stderr);
exit(1);
}
memcpy(&firstname[11], inbuf, n);
firstname[11 + n] = '\0';
如果你的反应是看起来像背后的巨大痛苦,我只能说,欢迎来到C编程。所有这一切实际上是面对任意畸形输入时的稳健性所必需的。
您还应该反思Falsehoods Programmers Believe About Names,然后相应地重新设计您的数据库。 (最重要的是在这种情况下:人们不一定将他们的名字划分为"第一"以及"最后"和#34;中间"组件;许多人都有名字要求超过10个字节来表示。)
编辑:现在应该更正示例代码中的错误。在没有测试的情况下,让我在脑子里做记忆算法。
答案 2 :(得分:0)
对你的问题的简短回答是,是的,你可以。
答案很长(以及随之而来的问题)......
firstname
的声明是什么?
11
的前filename
个地方有什么?
您是否尝试将用户输入的长度限制为11
个字符,这是您认为可行的语法?
我怀疑您试图将firstname
限制为最多11
个字符。解决这个问题的方法是:
char firstname[12];
scanf("%11s", firstname);
然而,正如扎克指出的那样,如果你有一个像“玫琳凯”这样的名字,这将会有问题。 scanf
将在第一个空格处停止,您将得到一个仅包含“Mary”的名字。更好的方法是使用fgets
。
fgets(firstname, 12, stdin);
如果一行中没有别的东西,这应该有效。
如果您希望从文件中读取数据并且某行中还有其他字段,那么您将不得不处理这种额外的复杂性。假设您有一行中的名字,姓氏和年龄。您的输入文件可能类似于:
John, Deer, 59 Mary Kay, Smith, 42
如果您的输入文件包含上述数据,则无法使用fgets
使用fgets(firstname, 12, infile);
选择名字。您必须使用fgets
来读取整行,然后解析该行以提取所有相关数据。