【问题标题】:How to fill a 2d array using "%s\n" instead of " %[^\n]"如何使用“%s\n”而不是“%[^\n]”填充二维数组
【发布时间】:2021-01-16 15:18:03
【问题描述】:

我对 C 很陌生。我想填充一个二维数组,其中每一行都使用一个字符串作为输入来填充。 我目前的解决方案如下:

char word[2][100]


for (int i = 0; i < 2; i++) {
        scanf(" %[^\n]", word[i]);
}

我通常理解 %[^\n] 说明符,但不明白为什么在它之前需要空间才能工作。

当我尝试对 %s 做同样的事情时,事情开始变得很奇怪。

char word[2][100]


for (int i = 0; i < 2; i++) {
        scanf("%s", word[i]);
}

它允许 3 个输入而不是 2 个输入并且使我的程序崩溃。

【问题讨论】:

  • why space is needed before 空格会跳过前一次读取在输入流中留下的换行符。 do the same with %s 你不能对 %s 做同样的事情,因为它读取空格分隔的字符串,而 %[^\n] 读取所有内容直到换行。
  • “它允许 3 个输入”是什么意思?在您未显示的此循环之后是否有对 scanf 的调用? 总是检查scanf返回的值。 从不使用"%s"。如果你想使用"%s",请使用最大字段限制版本"%99s"(在这种情况下99是合适的,因为你正在将一个字符串读入一个可以容纳最大长度为99的字符串的缓冲区)
  • 同样,考虑" %99[^\n]" 来防止缓冲区溢出。

标签: c scanf user-input format-specifiers


【解决方案1】:

"%s" 跳过前导空格,即使没有前导 " ",例如 ' ' 和上一行的 '\n',由于 Enter

" %[^\n]" 也会因为" " 而跳过前导空格,否则不会。然后它会寻找非'\n' 输入。

两者都不好,因为它们缺乏宽度控制,而且都不能正确读取


考虑避免使用scanf() 并使用fgets()

char word[2][100] = { 0 };
for (int i = 0; i < 2; i++) {
  char buffer[100 + 1];
  if (fgets(buffer, sizeof buffer, stdin) == NULL) break;
  buffer[strcpsn(buffer, "\n")] = '\0'; // lop off potential trailing \n
  
  strcpy(word[i], buffer);
}

还有其他问题,但需要开始 OP。

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 2013-11-29
    • 2019-03-30
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多