int main(int argc, char *argv[])
{
int length,i,j;
char *key;
printf("nnn 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;
}
当我执行时,它要求
输入 1.字符输入 2。字符输入这里输入 3.字符输入 4.字符
它就是这样,它不问奇怪的。不仅是奇数,例如长度为 7,它要求 4 个字符,然后是 3 个字符。为什么会这样?
%c
转换说明符不会跳过前导空格字符,因此它会从上一个条目中选择仍在输入流中的换行符。 IOW,假设您键入的长度为 10。 然后,输入流包含字符"1"。"0"和""。 第一个scanf("%d", &length)
调用使用"1"和"0",但在输入流中保留""。 因此,第一个scanf("%c", &key[i])
读取""字符,而不是您输入的字符。
解决此问题的方法是在格式字符串中%c
转换说明符之前添加一个空格:scanf(" %c", &key[i])
。 这将告诉scanf
跳过任何学习空格并将第一个非空格字符读入key[i]
。
原因是 %c 认为回车键也作为输入
分配内存而不是逐个读取字符后,只需使用 scanf("%s", key) 将其读取为字符串,或者如果您仍然想逐个字符读取字符,请在 scanf 语句中更改 %d 而不是 %c 这将起作用,只有 %c 到 %d 没有别的