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

C程序不';在.txt文件中看不到最后一个字母,c,C,这段代码基本上会创建一个txt文件并添加名称,如果用户输入新名称,它会添加到txt文件中,但不会看到最后一个字母,如jack->jac。顺便说一句,它保存在txt文件的名称完美。所以问题必须在dosyaOku()上解决。这些信息必须足够了,但由于stackoverflow,我需要添加更多细节 #include <stdio.h> #include <stdlib.h> #include <string.h> char allFile[1000][100],

这段代码基本上会创建一个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);

}
#包括
#包括
#包括
char allFile[1000][100],用户名[100];
int i=0;
int main()
{
addSomeNames();
dosyaOku();
isimAl();
isimKarsilastir();
dosyaOku();
返回0;
}
无效isimKarsilastir()
{
int a,ayni=0;
对于(a=0;a0)
{
printf(“Kullanici adi bulunmustur”);
}
其他的
{
dosyaYaz();
}
}
void dosyaYaz()
{
文件*ptrfile;
ptrfile=fopen(“sondokunus.txt”,“a”);
fprintf(ptrfile,“\n%s”,用户名);
fclose(ptrfile);
}
虚空幻觉()
{
printf(“Isim网格化:”);
获取(用户名);
printf(“女孩化isim:%s”,用户名);
}
void dosioku()
{
FILE*ptrfile=NULL;
int*ptri;
ptri=&i;
*ptri=0;
int-top=0;
ptrfile=fopen(“sondokunus.txt”,“r”);
而(fgets(所有文件[*ptri],100,ptrfile))
{
所有文件[*ptri][strlen(所有文件[*ptri])-1]='\0';
*ptri+=1;
}
top=*ptri;
printf(“\n Dosyadaki isimler:\n”);
对于(*ptri=0;*ptri
allFile[*ptri][strlen(allFile[*ptri])-1]='\0';
作为一个问题

allFile[*ptri]
处的字符串未以
“\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时,不要将
-1
strlen(allFile[*ptri])-1
一起使用

char *p = strchr( allFile[*ptri], '\n' );
if( p ) *p = '\0';

这非常清楚地说明了您在做什么,如果换行符不存在,则不依赖于覆盖NUL终止符。

如其他答案中所述,
dosyaOku
如果得到的行不是以
\n
结尾,则会出现错误的行为,您应该对此进行修复。但您的文件看起来像这样的原因首先是可能是
addSomeNames
中有一个单独的bug。您已经

        fprintf(ptrfile,"\n%s", names[n]);
在名称前打印换行符。这意味着文件将以空行开头,最后一行的结尾将不会有
\n
。您可能想写:

        fprintf(ptrfile,"%s\n", names[n]);

如果输入文件的最后一行没有以换行符结尾,则
allFile[*ptri][strlen(allFile[*ptri])-1]='\0';
将删除它确实包含的最后一个字符。事实上,这是因为
addSomeNames
在名称之前而不是之后打印换行符。正如Nate所指出的,您是通过将换行符放在名称之前来创建文件的。我会解决这个问题。但是,一些
.txt
文件忽略了la的换行符st行。剥离[可能]可选换行符的更确定的方法是:
allFile[*ptri][strlen(allFile[*ptri])-1]='\0';
-->
allFile[*ptri][strcspn(allFile[*ptri],“\n”)]='\0';
旁注:使用
*ptri
是一个不必要的复杂问题。您可以用
i
替换所有
*ptri
。在这个特定函数中,
i
不需要是全局的[AFAICT],这是另一种正确的方法。注意:
行[strcspn(行,“\n\r”)]=0;
可用于删除来自其他系统文本格式的烦人的各种行尾,如
'\n'
\r'
'\r\n'
,等等。