Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从第二个word开始的文件行上的和数-C编程_C_String_File - Fatal编程技术网

从第二个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()
会更安全,因为它会告诉您它没有处理的第一个字符。耸耸肩,问题并没有说任何关于任意空格的内容。但是,这很容易处理。请参见编辑。