在C中使用数组指针有问题

在C中使用数组指针有问题,c,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]

大家好,我是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);
intx,i=0;
char*myChar;
printf(“请输入长度:”);
scanf(“%d”和&x);
myChar=(char*)malloc(x*sizeof(char));
printf(“请输入%d个字符:”,x);

对于(i=0;i问题在于
scanf()
将其更改为

scanf(" %c",&myChar[i]);

%c
前面的空格将消耗缓冲区中的换行符,因为在
x
值后面有enter键,否则换行符将由循环中的
%c
获取。因此,在
%c
前面有一个空格,而不是在它后面。

第一个
scanf
没有使用返回键d来完成长度输入,因此它成为您读取的
x
字符的第一个,因此最后一个字符没有被读取。@Gopi的修复将解决此问题。

最可能的罪魁祸首是以下
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跳过任何领先的空白,并消耗下一个非空白字符。

也可以调用

fflush (stdin); 

在第五行之后

存储
“hello”
作为一个字符串,您需要6个字节,最后一个字节包含终止的
'\0'
。您正在数组中存储和访问单个字符,因此不需要
'\0'
,但这是一种有点奇怪的方法。有一种潜在的危险,但在这里没有遇到,但是如果您决定一次性打印整个字符串,请使用
printf(“%s”,myChar);
或使用某个库字符串函数,它会失败,原因有两个。首先,它没有零终止符,即使在输入循环后放置一个,并且
myChar[i]=0;
它也会失败,因为缓冲区不够大,除非您执行
myChar=malloc(x+1)
。请注意,
malloc()
调用中的其他虚饰是不必要的。