malloc()创建的数组是否添加了'\0';字符到数组的末尾?

malloc()创建的数组是否添加了'\0';字符到数组的末尾?,c,arrays,C,Arrays,我有一个代码,可以将txt文件的内容作为字符串反向打印。İ使用malloc()函数将字符串的每个字符存储在txt文件中。İt工作正常,但它使用前面的'\0'打印文本文件的内容,原因是什么 void veriyitersyazdir(FILE *file) { char metin; // that gets the every single char of my string int boyutsayac=0; // that stores my stri

我有一个代码,可以将txt文件的内容作为字符串反向打印。İ使用
malloc()
函数将字符串的每个字符存储在txt文件中。İt工作正常,但它使用前面的
'\0'
打印文本文件的内容,原因是什么

void veriyitersyazdir(FILE *file)
{
    char metin;          // that gets the every single char of my string
    int boyutsayac=0;    // that stores my string's size
    char *metinarr=NULL; // that is my malloc() array pointer
    int dongusayac;      // that is a counter variable that is used to print my string reversely.

    system("cls");

    file = fopen("C:\\metin.txt", "r");

    do {
        metin = fgetc(file);
        if (metin==EOF) {
            break;
        }

        boyutsayac++;
    } while (1);

    metinarr = (char *) malloc(sizeof(char)*boyutsayac);
    fseek( file, 0, SEEK_SET);
    for (dongusayac = 0; dongusayac < boyutsayac; dongusayac++) {
        metin = fgetc(file);
        metinarr[dongusayac]= metin;
    }

    fseek( file, 0 , SEEK_SET);
    for (; dongusayac >=0; dongusayac--) {
        printf("%c", metinarr[dongusayac]);
    }

    fclose(file);
}
void veryitersyazdir(文件*FILE)
{
char metin;//获取字符串的每个字符
int-boyutsayac=0;//存储字符串大小的
char*metinarr=NULL;//这是我的malloc()数组指针
int dongusayac;//这是一个计数器变量,用于反向打印字符串。
系统(“cls”);
file=fopen(“C:\\metin.txt”、“r”);
做{
metin=fgetc(文件);
if(metin==EOF){
打破
}
boyutsayac++;
}而(1),;
metinarr=(char*)malloc(sizeof(char)*boyutsayac);
fseek(文件,0,搜索集);
对于(dongusayac=0;dongusayac=0;dongusayac--){
printf(“%c”,metinar[dongusayac]);
}
fclose(文件);
}
txt文件的内容:Mustafa Mutlu


代码输出:UltuM afatsuM正如bluepixy所指出的,您的主要问题来自用于读取的
for
循环,该循环将
dongusayac
的字符数增加一个

for
循环中总是这样,因为它增加了变量,然后检查它是否仍然符合条件。因此,最后一次的增长永远不符合条件

以下是一种更干净的方法来完成您正在做的事情:

void reverse() {
    FILE *file;
    size_t size;
    int i;

    if (!(file = fopen("c:\\metin.txt", "r"))) {
            printf("error opening file\n");
            exit(1);
    }

    fseek(file, 0L, SEEK_END);
    size = ftell(file);

    char *content = malloc(size);           // allocate memory for the full text file
    fseek(file, 0, SEEK_SET);               // rewind the file cursor
    fread(content, 1, size, file);

    for (i = size - 1; i >= 0; i --) {      // output contents in reverse order
            printf("%c", content[i]);
    }

    fclose(file);
}

for(;dongusayac>=0;dongusayac--)
dongusayac
以一个较大的值开始。
metin=fgetc(文件)
其中
metin
是一个字符,这是完全错误的。看
fgetc
返回一个int,您应该遵守该约定,因为char可能不能表示EOF(在char未签名的系统上)。在有符号字符的系统上也是错误的,只是有点不同。这就是为什么你应该总是用英语编写源代码的原因。因为您最终可能需要帮助。我同意,但它肯定不是“\0”。变量名太混乱了,我没有注意到。我将更新我的答案以反映这一点。