【问题标题】:multiple char arrays scanf in a single string of text in CC中单个文本字符串中的多个字符数组scanf
【发布时间】:2018-12-16 10:46:31
【问题描述】:

对于 C 中的练习,我需要将三个名称放在三个不同的 char 数组中,但三个名称的输入在一行上。

#include <stdio.h>

int main(){
    char a[3], b[3], c[3];

    scanf("%s%s%s", a, b, c);
    printf(" \n %s ", a);
    printf("%s ", b);
    printf("%s", c);

    return 0;
}

输入将在一行中,如下所示: “aaabbbccc”
(不带“ ”)。

我试过了,但它需要按三下回车。

有没有办法用单行输入扫描多个数组?

我只能使用 stdio.h 和 scanf。

编辑:

这是完整的练习翻译(原文是意大利语)。

复制代码顶部的声明。

struct person {
    char name[10];
    struct person * mother;
    struct person * father;
} ;
typedef struct person Person;

编写一段代码,声明三个 Person 类型变量并从输入中读取:

儿子的名字(由10个字符组成,如果需要添加特殊字符$)。

母亲的名字(与儿子的名字相同)。

父亲的名字(与儿子的名字相同)。

(如果父亲和母亲未知,则使用 NULL 常量)。

这将代表一个 3 人的家庭。 然后编写一个打印 Person 的母亲和父亲姓名的 void 函数。如果这些名称未知,则打印“Unknown”(检查指针是否不同于 NULL)。

对全家人调用此函数。

这是输入示例:

罗伯塔$$$安娜$$$$$$Massimo$$$

忽略练习的最后一部分,我的问题是输入由30个字符组成,名称数组长度为10。我显然无法编辑名称数组的长度。

编辑: 我在三个长度数组上尝试了“%3s”解决方案,或者似乎工作正常,但是,如果数组的第三个插槽上有一个 '\0' 字符,这不应该是问题吗?

【问题讨论】:

  • 阅读scanf() 的文档可能会对您有所帮助。之后阅读sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html 了解它对您的伤害。
  • 为了像您尝试使用的那样存储三个字母的字符串,您需要每个包含四个字符的数组,因为最后需要零。
  • 好的,谢谢。我读到了这样一个事实,即 char 数组需要为 \0 多留一个空间,但练习大约是三个大小为 10 的数组,并且输入在一行中大约有 30 个字符,所以我必须找到一种解决方法。谢谢大家。

标签: c arrays char scanf


【解决方案1】:

嘿 Snoopy3 Stack overflow 不是让您完成家庭作业的平台。在这里我只能通过修改你的代码来帮助你。

使用scanf() 中的格式说明符,您可以在C 中的单个文本字符串中包含多个char 数组scanf()

试试这个代码:-

#include <stdio.h>

int main()
{
  char a[10], b[10], c[10];

  scanf("%10s%10s%10s", a, b, c);   // total 30 chars 10 per each string.

  for (int i = 0; i < 10; i++)      // removing rest '$';
  {
    if (a[i] == '$')
    {
      a[i] = '\0';
    }
    if (b[i] == '$')
    {
      b[i] = '\0';
    }
    if (c[i] == '$')
    {
      c[i] = '\0';
    }
  }

  printf(" \n %s ", a);
  printf("%s ", b);
  printf("%s", c);

  return 0;
}

输出:-

Roberta$$$Anna$$$$$$Massimo$$$

 Roberta Anna Massimo

【讨论】:

  • 感谢您的回答。我知道 stackoverflow 并不是为了解决我的工作,我写了整个练习,因为在其他用户的回答中,我被告知要更改数组的长度,所以我只是想表明练习不允许我这样做(这就是为什么我在帖子末尾写了忽略练习的第一部分)
  • 这对scanf("%10s%10s%10s", a, b, c); 有未定义的行为,用'\0' 终止符覆盖字符数组的末端。
  • @DavidBowling 用 '\0' 终止符覆盖字符数组的末端以降低计算复杂度。
  • @anoopknr -- 通过调用未定义的行为来简化代码并不是一个好策略。 %10s 指令告诉 scanf() 将最多 10 个字符写入一个数组,这里的数组最多可以包含 10 个字符。然后scanf() always 在写入字符串时写入空终止符,从而将字符写入,例如a[10],如果输入名称是 10 个字符长(根据 OP 的可能性)。这种越界写入可能看起来有效,但它会导致未定义的行为。如果 OP 想在作业中获得好成绩,他们不会用 UB 上交代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多