c数组错误,跳过某些元素 intmain(intargc,char*argv[]) { int长度,i,j; 字符*键; printf(“\n\n\n密钥的长度是多少?\n”); 扫描频率(“%d”和长度); key=(char*)malloc(length*sizeof(char)); 对于(i=0;i

c数组错误,跳过某些元素 intmain(intargc,char*argv[]) { int长度,i,j; 字符*键; printf(“\n\n\n密钥的长度是多少?\n”); 扫描频率(“%d”和长度); key=(char*)malloc(length*sizeof(char)); 对于(i=0;i,c,arrays,malloc,skip,C,Arrays,Malloc,Skip,而言,%c转换说明符不会跳过前导空格字符,因此它会从上一个条目中选取仍在输入流中的换行符。注意,假设键入长度为10。然后输入流包含字符“1”。“0”和“\n”。第一个scanf(“%d”,&length)调用使用“1”和“0”,但在输入流中保留“\n”。因此,第一个scanf(“%c”,&key[i])读取“\n”字符,而不是您输入的字符 解决方法是在%c转换说明符前面的格式字符串中添加一个空格:scanf(“%c”,&key[i])。这将告诉scanf跳过任何学习空白,并将第一个非空白字符读入

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


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

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


分配内存而不是逐字符读取后,只需使用scanf(“%s”,key)将其作为字符串读取,或者如果仍要逐字符读取,请更改scanf语句中的%d而不是%c,这样可以工作,只有%c到%d,没有其他内容

如果尝试检查
键[i]中的值,您可能会感到惊讶
以及scanf调用对似乎被跳过的插槽的返回值。执行此操作时,请考虑所有(所有)情况你在这个循环中输入你的键盘。我在这个循环之前制作了Prtff以查看SCANF是否是错误的,但是它仍然打印了愚蠢的东西。当你输入你的键盘输入时,你究竟输入了什么。每一个击键。如果它有帮助的话,请考虑:<代码> %c>代码>格式说明符> <代码> SCANF不跳过空白。嗯……想想看。
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;
}