大家好我是C的初学者,在测试数组指针和分配动态内存时遇到了麻烦。
int x,i=0;
char *myChar;
printf("Please enter the length: ");
scanf("%d",&x);
myChar = (char*)malloc(x*sizeof(char));
printf("Please enter %d characters:",x);
for(i=0;i<x;i++){
scanf("%c ",&myChar[i]);
}
for(i=0;i<x;i++){
printf("%c",myChar[i]);
}
free(myChar);
如果我为长度输入5,为字符数组输入“hello”,我得到“地狱”而不是“你好”,这不好玩。有谁可以帮我这个?感谢
答案 0 :(得分:3)
问题在于您scanf()
将其更改为
scanf(" %c",&myChar[i]);
%c
之前的空格将使用缓冲区中的换行符,因为输入键后跟x
的值,否则新行字符将被%c
中的%c
提取环。所以在{{1}}之前有一个空格而不是它之后。
答案 1 :(得分:3)
最可能的罪魁祸首是以下scanf
电话:
scanf("%c ",&myChar[i]);
将其更改为以下内容:
scanf(" %c", &myChar[i]);
请注意,我将空格切换到%c
转换说明符之前。
以下是发生的情况:当您输入数组大小时,输入流将包含以下字符:'5' '\n'
。第一个scanf
调用会使用'5'
并将'\n'
保留在输入流中。
输入hello
时,输入流包含'\n' 'h' 'e' 'l' 'l' 'o' '\n'
。下一个scanf
调用会从输入流中读取'\n'
并将其分配给myChar[0]
,因为%c
不会跳过前导空格。因此,您最终会从输入流中读取'\n' 'h' 'e' 'l' 'l'
,并将它们分配给您的myChar
数组。
通过在%c
转换说明符之前放置空格,可以告诉scanf
跳过任何前导空格并使用下一个非空白字符。
答案 2 :(得分:0)
第一个scanf
不是吃用于完成长度输入的返回键,因此它成为您读取的x
个字符中的第一个,因此最后一个字符 isn&#t; t 正在被阅读。 @ Gopi的解决方案将解决这个问题。
答案 3 :(得分:0)
您也可以致电
fflush (stdin);
在第五行之后