C 程序在 .txt 文件中看不到最后一个字母

标签 c

此代码基本上创建一个 txt 文件并添加名称,如果用户输入新名称,它会添加到 txt 文件,但它看不到最后一个字母,如 jack -> jac 。顺便说一句,它将名称完美地保存在 txt 文件中。所以问题必须在 dosyaOku() 。这些信息一定足够了,但由于 stackoverflow,我需要添加更多细节。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char allFile[1000][100],userName[100];
int i = 0;

int main()
{
    addSomeNames();
    dosyaOku();
    isimAl();
    isimKarsilastir();
    dosyaOku();
    return 0;
}
void isimKarsilastir()
{
    int a,ayni = 0;
    for (a=0 ; a < i; a++)
    {
        if (strcmp(allFile[a],userName) == 0)
        {
            printf("ayni\n");
            ayni++;
        }
        else
        {
            printf("farkli\n");
        }
    }
    if (ayni>0)
    {
        printf("Kullanici adi bulunmustur\n");
    }
    else
    {
        dosyaYaz();
    }
}
void dosyaYaz()
{
    FILE * ptrfile;
    ptrfile = fopen("sondokunus.txt","a");
    fprintf(ptrfile,"\n%s",userName);
    fclose(ptrfile);

}
void isimAl()
{

    printf("Isim giriniz: ");
    gets(userName);
    printf("Girdiginiz isim: %s",userName);


}
void dosyaOku()
{

    FILE *ptrfile = NULL;
    int *ptri;
    ptri = &i;
    *ptri = 0;
    int top = 0;

    ptrfile = fopen("sondokunus.txt", "r");
    while(fgets(allFile[*ptri], 100, ptrfile))
    {
        allFile[*ptri][strlen(allFile[*ptri]) - 1] = '\0';
        *ptri += 1;
    }
    top = *ptri;
    printf("\n Dosyadaki isimler: \n");
    for(*ptri = 0; *ptri < top; *ptri += 1)
    {
        printf("%s\n", allFile[*ptri]);
    }
    fclose(ptrfile);
}
void addSomeNames()
{
    FILE * ptrfile;
    ptrfile = fopen("sondokunus.txt", "w+");
    char names[100][100];
    strcpy(names[0],"mike");
    strcpy(names[1],"joe");
    strcpy(names[2],"jack");
    for (int n=0;n <= 2; n++)
    {
        fprintf(ptrfile,"\n%s", names[n]);
    }
    fclose(ptrfile);

}

最佳答案

代码至少有::

allFile[*ptri][strlen(allFile[*ptri]) - 1] = '\0'; 作为一个问题。

allFile[*ptri] 中的 string 不以 "\n" 结尾时(由于阅读了最后一个,这很常见文本文件中的行),它会删除非 '\n' 字符。

代替

size_t length_of_string_without_linefeed = strcspn(allFile[*ptri], "\n");
allFile[*ptri][length_of_string_without_linefeed] = '\0';
// or
allFile[*ptri][strcspn(allFile[*ptri], "\n")] = '\0';

allFile[*ptri][strlen(allFile[*ptri]) - 1] 是黑客可利用的。

如果文件中的第一个字符是空字符,则代码如下:

allFile[*ptri][(size_t)0 - 1]
// or 
allFile[*ptri][SIZE_MAX]

这会导致未定义的行为

strlen(allFile[*ptri]) == 0- 1strlen(allFile[*ptri]) - 1 一起使用.

关于C 程序在 .txt 文件中看不到最后一个字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67233734/

相关文章:

c - C 中的 Malloc 警告

c - 模仿printf

c - 什么是调度表?我如何在 C 中实现它?

c - 考虑稀疏矩阵获取转置矩阵(可能与排序有关)

计算圆形数量级

c - 我给 malloc 什么参数有什么关系?

c - 链接时允许不同的类型

c - 调试时使用 exit() 函数

C - 在二叉搜索树中搜索数字

c - 函数 C 不会打印