使用loop to和atof使上万个str加倍,但在C程序中只有少数工作
下面的代码是C代码,t是来自txt文档的字符串,这里有10000多个字符串,就像我在代码使用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
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';