c - C 程序在 .txt 文件中看不到最后一个字母
问题描述
此代码基本上创建一个 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';
作为一个问题。
当字符串at allFile[*ptri]
不以 a 结尾"\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]
这会导致未定义的行为。
不要- 1
与strlen(allFile[*ptri]) - 1
when一起使用strlen(allFile[*ptri]) == 0
。
推荐阅读
- python - 使用 hCaptch + Cloud Flare 保护绕过网站
- javascript - 创建用户帐户后的 Firebase 配置文件
- laravel - $bucket 'boundaries' 字段必须是数组,但找到类型:字符串
- python-3.x - 打开运行另一个线程的第二个响应框架
- cryptocurrency - Uniswap V3 关于价格范围和掉期细节
- android - 如何从firebase实时数据库中对附近用户的帖子进行排序?
- php - 我想在 laravel 中使用 ajax 替换输入值
- android - 如何在 Android Studio 中配置 SDK
- ios - 获取当前连接到我的 iPhone 的设备列表
- opencl - 使用 hashcat 时如何修复“使用 openCL 构建失败错误”