Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
realloc之后的怪异角色_C_Loops_Scanf_C Strings_Realloc - Fatal编程技术网

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。可能是的重复项