如何分配字符串值

时间:2014-04-06 18:58:17

标签: c string scanf

我可以执行类似下面代码的操作,将人名改为firstname字符串吗?

printf("First Name? ");
scanf("%s", &firstname[11]);

3 个答案:

答案 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来读取整行,然后解析该行以提取所有相关数据。