realloc之后的怪异角色
我正在编写一个程序,将用户输入的字符逐个输入,并在最后打印出来:realloc之后的怪异角色,c,loops,scanf,c-strings,realloc,C,Loops,Scanf,C Strings,Realloc,我正在编写一个程序,将用户输入的字符逐个输入,并在最后打印出来: #include <stdio.h> #include <stdlib.h> #define FACTOR 2 int main(void) { printf("Enter line: "); int curr_size = 10; char curr_char = 0; char *ptr = malloc(curr_size * sizeof(char));
#include <stdio.h>
#include <stdlib.h>
#define FACTOR 2
int main(void) {
printf("Enter line: ");
int curr_size = 10;
char curr_char = 0;
char *ptr = malloc(curr_size * sizeof(char));
int num_of_chars = 0;
while (1) {
int res = scanf(" %c", &curr_char);
if (res == EOF) {
break;
}
if (res != 1) {
printf("Error: %c is not a character", res);
break;
}
if (num_of_chars == curr_size) {
curr_size = FACTOR * curr_size;
ptr = realloc(ptr, curr_size);
}
ptr[num_of_chars] = curr_char;
num_of_chars++;
}
printf("%s\n", ptr);
return 0;
}
#包括
#包括
#定义因子2
内部主(空){
printf(“输入行:”);
int curr_size=10;
char curr_char=0;
char*ptr=malloc(curr_size*sizeof(char));
int num_of_chars=0;
而(1){
int res=scanf(“%c”和curr_char);
如果(res==EOF){
打破
}
如果(res!=1){
printf(“错误:%c不是字符”,res);
打破
}
if(字符数==当前大小){
当前大小=系数*当前大小;
ptr=realloc(ptr,当前大小);
}
ptr[num_of_chars]=curr_char;
字符数++;
}
printf(“%s\n”,ptr);
返回0;
}
但是,我注意到,每当我输入一行超过10个字符(触发realloc)时,在输出时会在我的行末尾追加一个未知字符:如果我更改
ptr[num\u of\u chars]=curr\u char代码>到*(ptr+num\u of\u chars)=当前字符代码>角色消失,我可以知道为什么以及如何修复它吗?提前感谢。考虑到此if声明
if (res == EOF) {
break;
}
if (res != 1) {
printf("Error: %c is not a character", res);
break;
}
ptr[num_of_chars] = curr_char;
下面的if语句
if (res == EOF) {
break;
}
if (res != 1) {
printf("Error: %c is not a character", res);
break;
}
ptr[num_of_chars] = curr_char;
没有道理。此外,您还试图将函数scanf
返回的整数作为字符输出
通常,函数realloc
可以返回NULL。在这种情况下,将出现内存泄漏,因为指针ptr
的上一个值被覆盖
ptr = realloc(ptr, curr_size);
这句话呢
if (res == EOF) {
break;
}
if (res != 1) {
printf("Error: %c is not a character", res);
break;
}
ptr[num_of_chars] = curr_char;
将调用未定义的行为
您还试图将字符数组作为字符串输出
printf("%s\n", ptr);
但是您没有在数组中附加终止的零字符
在这种情况下,您至少应该像
printf("%*.*s\n", num_of_chars, num_of_chars, ptr);
或者必须附加终止的零字符
您应该释放分配的内存
这个程序看起来像
#include <stdio.h>
#include <stdlib.h>
#define FACTOR 2
int main(void)
{
size_t curr_size = 10;
char *ptr = malloc( curr_size * sizeof( char ) );
ptr[0] = '\0';
char c;
printf( "Enter line: " );
size_t i = 0;
for ( ; scanf( "%c", &c ) == 1 && c != '\n'; i++ )
{
if ( i == curr_size )
{
char *tmp = realloc( ptr, curr_size * FACTOR );
if ( tmp == NULL ) break;
curr_size *= FACTOR;
ptr = tmp;
}
ptr[i] = c;
}
// i == curr_size ? ptr[i-1] = '\0' : ( ptr[i] = '\0' );
// puts( ptr );
printf( "%*.*s", ( int )i, ( int )i, ptr );
free( ptr );
return 0;
}
#包括
#包括
#定义因子2
内部主(空)
{
大小\u t当前大小=10;
char*ptr=malloc(curr_size*sizeof(char));
ptr[0]='\0';
字符c;
printf(“输入行:”);
尺寸i=0;
对于(;scanf(“%c”,&c)==1&&c!='\n';i++)
{
如果(i==当前大小)
{
char*tmp=realloc(ptr,curr_size*系数);
如果(tmp==NULL)中断;
电流大小*=系数;
ptr=tmp;
}
ptr[i]=c;
}
//i==当前大小?ptr[i-1]='\0':(ptr[i]='\0');
//看跌期权(ptr);
printf(“%*.*s”,(int)i,(int)i,ptr);
免费(ptr);
返回0;
}
您要逐个字符构建的字符串在哪里终止<代码>%s
强制要求使用以null结尾的序列,而您并没有最终提供一个序列。因此,调用printf(“%s\n”,ptr)代码>调用未定义的行为。“%c不是字符”永远不会发生--您可以键入的任何内容都是字符。您永远不会向字符串添加空终止符。您需要检查realloc返回的值。它可以返回NULL。可能是的重复项