0
int main(int argc, char *argv[])

{

  int length,i,j;

  char *key;

  printf("\n\n\n   What is the length of key?\n");
  scanf("%d",&length);

  key=(char*)malloc (length*sizeof(char));

  for(i=0;i<length;i++)
  {
                      printf("\n Enter  %d. character ...\n",i+1);
                      scanf("%c",&key[i]);
 }

 getch();
  system("PAUSE");
  return 0;
}

当我执行时,它会询问

enter 1.character enter 2. character input here enter 3.char enter 4.char

就这样,它不问奇数。不仅奇数,例如长度为 7,它问 4 个字符,然后是 3 个字符。为什么会这样?

4

2 回答 2

1

转换说明%c符不会跳过前导空白字符,因此它会从上一个条目中选择仍在输入流中的换行符。IOW,假设您输入的长度为 10。然后输入流包含字符“1”。“0”和“\n”。第一次scanf("%d", &length)调用消耗“1”和“0”,但将“\n”留在输入流中。因此,第一个scanf("%c", &key[i])读取 '\n' 字符,而不是您输入的字符。

解决方法是在转换说明符之前在格式字符串中添加一个空格%cscanf(" %c", &key[i])。这将告诉scanf跳过任何学习空白并将第一个非空白字符读入key[i].

于 2013-10-25T17:09:41.463 回答
0

原因是 %c 将输入键也视为输入

一旦分配内存而不是逐个字符读取字符,只需使用 scanf("%s", key) 将其作为字符串读取,或者如果您仍想逐个字符读取字符,请在 scanf 语句中更改 %d 而不是 %c将工作,只有 %c 到 %d 没有别的

于 2013-10-25T17:20:31.437 回答