使用loop to和atof使上万个str加倍,但在C程序中只有少数工作

使用loop to和atof使上万个str加倍,但在C程序中只有少数工作,c,strsep,C,Strsep,下面的代码是C代码,t是来自txt文档的字符串,这里有10000多个字符串,就像我在代码printf(“%s\n”,t)中打印的一样,我可以看到很多str。但是,当我使用atof使t变为int时, 只有72个str变成了双倍,有人知道怎么回事吗 int f; char buf[BUFSIZ], *p, *t; struct dataset *s; double d; int line; int i; int reading; if (n == NULL) // n is a number f

下面的代码是C代码,t是来自txt文档的字符串,这里有10000多个字符串,就像我在代码
printf(“%s\n”,t)中打印的一样,我可以看到很多str。但是,当我使用atof使t变为int时, 只有72个str变成了双倍,有人知道怎么回事吗

int f;
char buf[BUFSIZ], *p, *t;
struct dataset *s;
double d;
int line;
int i;
int reading;


if (n == NULL) // n is a number from global
{
    f = STDIN_FILENO;
    n = "<stdin>";
}
else if (!strcmp(n, "-"))
{
    f = STDIN_FILENO;
    n = "<stdin>";
}
else
{
    f = open(n, O_RDWR);
}
if (f == -1)
    err(1, "Cannot open %s", n);

s = NewSet();
s->name = strdup(n);


while ((reading = read(f, buf, sizeof(buf) - 1)) > 0)
{
    

    i = strlen(buf);


    char *ptr = strdup(buf); //duplicate of pointed to by buf
    char *ptr_copy = ptr;    //copy ptr, let strsep work on  prt_copy
    for (i = 1, t = strsep(&ptr_copy, delim);
         t != NULL && *t != '#';
         i++, t = strsep(&ptr_copy, delim))
    {

        if (i == column)
            break;
    }

    if (t == NULL || *t == '#')
        continue;

    printf("%s\n", t);

    d = atof(t);

        printf("%f\n", d);
         free(ptr);}
intf;
字符buf[BUFSIZ],*p,*t;
结构数据集*s;
双d;
内线;
int i;
整型阅读;
如果(n==NULL)//n是来自全局的数字
{
f=标准文件号;
n=“”;
}
否则,如果(!strcmp(n,“-”)
{
f=标准文件号;
n=“”;
}
其他的
{
f=开路(n,Ordwr);
}
如果(f==-1)
错误(1,“无法打开%s”,n);
s=新闻集();
s->name=strdup(n);
而((reading=read(f,buf,sizeof(buf)-1))>0)
{
i=斯特伦(buf);
char*ptr=strdup(buf);//由buf指向的的的副本
char*ptr\u copy=ptr;//复制ptr,让strep处理prt\u copy
对于(i=1,t=strep(&ptr_copy,delim);
t!=NULL&&*t!='#';
i++,t=strep(&ptr_copy,delim))
{
if(i==列)
打破
}
如果(t==NULL | |*t=='#')
继续;
printf(“%s\n”,t);
d=atof(t);
printf(“%f\n”,d);
自由(ptr);}

您的程序失败,因为您没有null终止从文件读取的字符串

read(f, buf, sizeof(buf) - 1)
这将从文件中读取原始字节,并将它们存储在
buf
中,无需任何操作

它不会将
\0
添加到读取输入的末尾

之后,双方:

i = strlen(buf);

将产生不可预测的结果,很可能是在字符串末尾计算和复制垃圾

而且无法确定此循环将为文件中的每一行运行多长时间:

for (i = 1, t = strsep(&ptr_copy, delim);
     t != NULL && *t != '#';
     i++, t = strsep(&ptr_copy, delim))
因此,即使看不到您的输入或完整的代码,看起来您也需要首先将文件句柄包装在
file*
对象中,然后使用
fgets
,或者使用null终止
读取的结果,如下所示:

buf[reading] = '\0';

您没有显示足够的代码让我们知道
d
是什么类型,但您在问题中说了
int
。如果您使用的是
atof()
,并且希望得到
int
,那么这至少是您的问题之一。PS:要获得更多/更好的答案,请在问题中包含更多代码。一个小的可编译的例子是一个很好的起点,还有一些说明问题的输入。@Caleb我尝试了int和double,但只有一些相同的工作。请提供一个示例。也就是说,任何人都可以完全按照所示运行的完整代码来重现示例。。。。包括一些示例输入,特别是在您认为应该成功的地方失败的示例;在i=strlen(buf)之后的前面;,我也试着在底部加上,但结果是same@LeeAlex你必须把它加在'i=strlen(buf);`否则,
strlen
将无法正常工作。另外,您实际上不需要
strlen
,因为您有
读取
,它会给出字符串的长度。
buf[reading] = '\0';