从第二个word开始的文件行上的和数-C编程
以下是我的意见:从第二个word开始的文件行上的和数-C编程,c,string,file,C,String,File,以下是我的意见: david 10 40 70 sam 9 45 31 miranda 10 20 50 zhang 10 26 41 我试图为每行添加所有这些数字,然后在终端中打印出来,如下所示: david 120 sam 85 etc... 如何从一行中的第二个单词开始计算这些数字的总和?以下是我的一些上下文代码: #include <stdio.h> #include <stdlib.h> #include <string.h>
david 10 40 70
sam 9 45 31
miranda 10 20 50
zhang 10 26 41
我试图为每行添加所有这些数字,然后在终端中打印出来,如下所示:
david 120
sam 85
etc...
如何从一行中的第二个单词开始计算这些数字的总和?以下是我的一些上下文代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fr;
char * line = NULL;
size_t len =0;
ssize_t read;
int main(int argc, char* argv[]){
fr = fopen(argv[1], "r");
if(fr==NULL){
exit(EXIT_FAILURE);
}
while ((read = getline(&line, &len, fr)) != -1){
printf("%s", line );
}
fclose(fr);
if (line){free(line);}
return 0;
}
#包括
#包括
#包括
文件*fr;
char*line=NULL;
尺寸长度=0;
阅读;
int main(int argc,char*argv[]){
fr=fopen(argv[1],“r”);
如果(fr==NULL){
退出(退出失败);
}
while((read=getline(&line,&len,fr))!=-1){
printf(“%s”,第行);
}
fclose(fr);
if(line){free(line);}
返回0;
}
您可以尝试(编辑:或者按照@1.618的建议,与PHP的strsplit稍有不同),然后使用
我不确定strsplit()是否存在于C标准库中,您可能需要自己重新编码:它需要一个char*(要拆分的字符串)和一个char(分隔符,在本例中是空格),并且应该返回一个char**,其中是您可以传递给atoi()的子字符串(单词)如果缓冲区以null结尾,则可以就地执行,无需特殊的字符串拆分函数,并可以处理任意数量的数字
int sumline(char *buf)
{
int sum=0;
size_t i;
for(i=0; buf[i] != '\0'; i++)
{
if(buf[i] == ' ' && isdigit(buf[i+1]))
{
sum += atoi(buf+i+1);
}
}
return sum;
}
只需在字符上迭代,每当你点击空格时,从下一个字符开始在字符串上运行
atoi
。名称后面总是有3个数字吗?可以有任意数量的数字哦--我想建议sscanf()
,但是如果数字的数量不一致,这是行不通的。你可能想回顾一下——或者,至少,它给了你一种分析你所读行中数字的方法。很好地使用了getline()
。strsplit()是一个php函数,而不是c。我知道等价的c函数是strtok(),但这并不禁止在c中重新编码:)(作为练习,我必须在学校自己做)。也许有更好的方法,但至少我可以建议这样做。我敢肯定,如果你不想自己重新编码,你可以在网上找到一些来源。编辑:我不知道strtok()。不是要叫几次吗?但它可能是有用的请检查这个链接也..谢谢你的建议。如何从等式中删除第一个字符,使其不会错误地添加到数字的总和?如果输入的数字之间有两个空格,您的代码将计算两次,不是吗?使用strtol()
会更安全,因为它会告诉您它没有处理的第一个字符。耸耸肩,问题并没有说任何关于任意空格的内容。但是,这很容易处理。请参见编辑。