在C中使用数组指针有问题
大家好,我是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]
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()
调用中的其他虚饰是不必要的。