gpt4 book ai didi

c - C 中文件读取不正确

转载 作者:行者123 更新时间:2023-11-30 18:46:12 25 4
gpt4 key购买 nike

我正在为医院 channel 进行套接字编程。我正在尝试读取这样的文本文件

1   Kavi    card    0   0   0
2 Anparasanesan gene 0 0 0
3 Thilak card 0 0 0
4 Akilanesan immu 0 0 0
5 Aravinthanesan derm 0 0 0
6 Akalya derm 0 0 0
7 Vishvapriya derm 0 0 0
8 Kavinga immu 0 0 0
9 Anjalie andr 0 0 0
10 Tom andr 0 0 0

但是当我阅读该文件时,它给出的输出为:

enter image description here

1   Kavi    cardgenecardimmudermdermdermimmuandrandr
2 Anparasanesan genecardimmudermdermdermimmuandrandr
3 Thilak cardimmudermdermdermimmuandrandr
4 Akilanesan immudermdermdermimmuandrandr
5 Aravinthanesan dermdermdermimmuandrandr
6 Akalya dermdermimmuandrandr
7 Vishvapriya dermimmuandrandr
8 Kavinga immuandrandr
9 Anjalie andrandr
10 Tom andr

这是我的代码段

char line[MAXCHAR];
int x = 0;
while (fgets(line, sizeof(line), fp)){
sscanf(line,"%d\t%s\t%s\t%d\t%d\t%d",&dno,&dname,&dspl,&ti1,&ti2,&ti3);

id[x]=dno;
strncpy(name[x], dname, 50);
strncpy(spl[x], dspl, 4);
times[x][0]=ti1;
times[x][1]=ti2;
times[x][2]=ti3;

x++;
}

int z=0;
for(z=0;z<10;z++)
{
snprintf(line, sizeof(line),"%d\t%s\t%s\n",id[z],name[z],spl[z]);
n = strlen(line);
Writen(sockfd,line,n);
}

最佳答案

让我们看看其中一个问题。

邪恶的strncpy

代码正在使用 strncpymagic number 4. 这并不能确保 spl[x] 是一个字符串,因为字符可能缺少最后一个空字符

        strncpy(spl[x], dspl, 4);  // Avoid code like this

稍后的代码尝试使用 "%s"spl[z] 打印字符串,并得到“cardgene...”比预期的“卡”。当 spl[z] 不是字符串时,结果是未定义行为 (UB) - 任何事情都可能发生。

        // Alternative: could limit output with
snprintf(line, sizeof(line),"%.*s\n",(int) (sizeof spl[z]), spl[z]);
<小时/>

如何解决?

不要使用sscanf(line,"%s",&dspl);,因为它缺少宽度限制,或者不知道dspl是关于相同大小的。我预计

char dspl[4+1];
sscanf(line,"%4s", dspl);

最好确保源字符串和目标数组足够,而不是在没有测试的情况下使用 strncpy()

char spl[X_N][4+1];
char dspl[sizeof spl[0]];

// strncpy(spl[x], dspl, 4);
strcpy(spl[x], dspl);

其他修复包括确保 sscanf() 按预期完成。一种简单的方法是使用“%n”来记录扫描偏移量(如果扫描到了那么远),然后查找额外的垃圾。删除了不必要的“\t”

// Insure  dname is at least 50+1, dspl is 4+1 or as big as the line
char dname[sizeof line];
char dspl[sizeof line];

// sscanf(line,"%d\t%s\t%s\t%d\t%d\t%d",&dno,&dname,&dspl,&ti1,&ti2,&ti3);
int n = 0;
sscanf(line,"%d%50s%4s%d%d%d %n",&dno,dname,dspl,&ti1,&ti2,&ti3, &n);
if (n==0 || line[n]) {
puts("Bad Input"); // Handle bad input in some fashion
exit(RETURN_FAILURE);
}

关于c - C 中文件读取不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52613101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com