c - Scanf 将错误类型的变量寻址到数组

标签 c scanf

例如,第一个输入是“B 2 A 0”,请按 Enter。 team1[0] = 'B' 其余部分寻址 True。到目前为止没有问题。 但在第二个输入中会发生这种情况..假设这是我的第二个输入>>“A 1 B 1” team1[1] 不是“A”。正如您所猜测的 score1[1]score2[1] 也不是 1,这就是我问的原因。

// the first versions of the arrays 
// 0x7fffffffea60 "p\353\377\377\377\177"    team1[size]
// 0x7fffffffea50 "\240\353\377\377\377\177" team2[size]

// after 1st input ( assume "B 2 A 0" )
// 0x7fffffffea60 "B\353\377\377\377\177"    team1[size]
// 0x7fffffffea50 "A\353\377\377\377\177"    team2[size]

// after 2nd input ( assume "A 1 B 1" )
// 0x7fffffffea60 "B\n\377\377\377\177"      team1[size]
// 0x7fffffffea50 "A\353\377\377\377\177"    team2[size]

char team1[size];
char team2[size];
int score1[size];
int score2[size];

for(i=0;i<size;i=i+1)
{
    scanf("%c %d %c %d",&team[i],&score1[i],&team2[i],&score2[i]);
}

最佳答案

char team1[size];
char team2[size];
int score1[size];
int score2[size];

for(i=0;i<size;i=i+1)
{
  scanf("%c %d %c %d",&team[i],&score1[i],&team2[i],&score2[i]);
}

正如你所说

1st input is "B 2 A 0" press Enter.

您的第一个 scanf 未读取 enter 并且仍然可用,因此第二个循环第一个 %c获取它,然后 scanf 看到 A 第一个 %d并返回而不设置 score1[1] team2[1]score2[1]

正如评论中所说,您可以使用 " %c %d %c %d" ,绕过输入开头的空格和换行符。

请注意,您已经使用了绕过 %d 之间的空格。和%c所以N 2 A 0已按预期读取

正如评论中所述,当输入正确时,检查 scanf 的结果为 4

#include <stdio.h>

#define size 100

int main()
{
  char team1[size];
  char team2[size];
  int score1[size];
  int score2[size];
  int i, j;

  for(i=0; i < size; ++i)
  {
    if (scanf(" %c %d %c %d", &team1[i], &score1[i], &team2[i], &score2[i]) != 4)
      break;
  }

  /* check */
  puts("input values:");

  for(j=0; j<i ; ++j)
  {
    printf("%c %d %c %d\n", team1[j], score1[j], team2[j], score2[j]);
  }
}

编译和执行:

pi@raspberrypi:/tmp $ ./a.out
B 2 A 0
A 1 B 1

   C 22     D13
input values:
B 2 A 0
A 1 B 1
C 22 D 13

(我使用了不可见的control+d来完成输入)

关于c - Scanf 将错误类型的变量寻址到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55207176/

相关文章:

c++ 如何正确预定义 char* 数组?

c - Microsoft 驱动程序示例中的 DebugTrace

C - 指针插入算法

c - 使用 fscanf() 在 C 中以科学格式读取数字时出现问题

c - 使用 fscanf 和 fprintf 更新文件

c - GtkPaned 来自鼠标的移动 handle 信号?

c - scanf() 将换行符保留在缓冲区中

c - 什么是 scanf ("%*[\n] %[^\n]", input_string);做?

c - 使用 Fscanf 解析特定的输入文件

c++ - 为什么 round() 和 ceil() 不返回整数?