在C中遇到数组指针有问题

时间:2015-02-12 16:55:26

标签: c

大家好我是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”,我得到“地狱”而不是“你好”,这不好玩。有谁可以帮我这个?感谢

4 个答案:

答案 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); 

在第五行之后