如何在C中的字符串中添加逗号分隔值

时间:2017-10-19 06:46:21

标签: c csv

如何在字符串中添加所有csv值?

我制作了一个骨架,但是我应该将字符串转换为整数并使用+=来添加所有整数吗?

#include <stdio.h>
int main(void)
{
    int i;                  // index
    int num=0, sum=0;       // number
    char str[]="123,456,789";

    for(i=0; str[i]; i++) {
        if (str[i] == ',') { // begin a new number
            - ① - // multiple statements are allowed
        } else { // a digit
            num = ②;
        }
    }
    sum += num; 
    printf("Sum of all values in CSV[%s] : %d", str, sum);

    return 0;
}

5 个答案:

答案 0 :(得分:3)

有很多方法可以解决这个问题。首选只是使用strtol作为预期目的,并使用endptr参数迭代字符串,以便在成功转换后的最后一位数字后将字符串中的位置更新为1。

但是,学习使用数组索引(或者最好是指针)来迭代字符串以解析字符串所需的内容是很有价值的。用一对指针 inch-worming 进行解析是没有什么太复杂的了,你可以选择你想要的东西。

此处似乎您想循环遍历字符串中的每个字符,测试逗号或数字,并采取相应的操作将数字添加到number,或添加您的如果遇到逗号,则numbersum。不要忘了你必须将字符的ASCII值转换为整数值,然后才能在你的号码中使用它。

您尝试的内容的简单实现可能如下所示:

#include <stdio.h>

int main(void)
{
    int i,
        num=0,
        sum=0;
    char str[] = "123,456,789";

    for (i = 0; str[i]; i++)    /* loop over each char */
        if (str[i] == ',') {    /* begin a new number */
            sum += num;         /* add number to sum */
            num = 0;            /* reset number to 0 */
        }
        else                    /* add digit to number */
            num = num * 10 + (str[i] - '0');

    sum += num;                 /* add final number to sum */

    printf ("Sum of all values in CSV[%s] : %d\n", str, sum);

    return 0;
}

示例使用/输出

$ ./bin/csvsum
Sum of all values in CSV[123,456,789] : 1368

strtol实施

首选strtol(或任何strtoX系列)的原因是由于它们为转换提供的错误检查以及转换后的字符串内的指针的内置推进到转换后的数字后面的字符串中的下一个字符。 (在您的情况下,endptr参数将在每次转换后指向字符串中的comma nul-terminatedating 字符。

这样,您只需使用strtol和一对指针(pep - 指针结束,向下走一下字符串-pointer ),使用strtol (p, &ep, base)将每组数字转换为数字。每次成功转换后,只需向前跳转ep,直到找到下一个有效转化的'+-''0-9',然后设置p = ep;并重复。 (如果您在推进ep的同时到达 nul-terminated 字符 - 您知道已完成转换)

一个简单的实现是:

#include <stdio.h>
#include <stdlib.h>     /* for strtol */
#include <limits.h>     /* for INT_MAX */
#include <errno.h>      /* for errno */

#define BASE 10         /* added benefit - strtol will convert from many bases */

int main (void)
{
    int sum=0;
    long tmp = 0;                   /* tmp long for strtol conversion */
    char str[] = "123,456,789",
        *p = str, *ep = NULL;       /* pointer and end-pointer */

    for (;;) {                      /* perform conversion until end (or error) */
        errno = 0;                      /* reset errno */
        tmp = strtol (p, &ep, BASE);    /* perform conversion, update ep */
        if (errno) {                    /* check conversion was valid */
            fprintf (stderr, "error: invalid conversion.\n");
            return 1;
        }
        if (tmp < INT_MAX - sum)        /* make sure tmp will fit in sum */
            sum += (int)tmp;            /* add tmp to sum */
        else {
            fprintf (stderr, "error: sum overflowed.\n");
            return 1;
        }
        /* find the next '+-' or 'digit' or end of string */
        while (*ep && *ep != '+' && *ep != '-' && ( *ep < '0' || '9' < *ep))
            ep++;
        if (!*ep) break;    /* if *ep is nul-character, end reached, bail */
        p = ep;             /* update pointer to end-pointer, repeat */
    }

    printf ("Sum of all values in CSV[%s] : %d\n", str, sum);

    return 0;
}

仔细看看,如果您有其他问题,请告诉我。

答案 1 :(得分:0)

首先,您可以修剪所有空白区域。

其次,正如您所提到的,只有逗号分隔的整数,所以您应该了解获取整数的一般方法。

那么这个想法是什么?

除非您看到逗号或字符串结尾,否则您将继续编号。

如何形成数字?

|ABCD
      num
A|BCD  A   [Here also 10*0+A]
AB|CD  A*10+B
ABC|D  (A*10+B)*10+C
ABCD|  ((A*10+B)*10+C)*10+D = 1000*A+100*B+10*C+1*D

您将现有数字重复乘以10,然后将其添加。

这样就形成了数字。

我避免给出功能的答案。还有其他选项,例如使用内置函数,例如strtok等。您可以在参考中查看它们。

答案 2 :(得分:0)

您可以使用strtokstrtol功能执行您想要的功能:

int main(void)
{
    /* delimiter: string will be cut on spaces and comma */
    char delim[] = " ,";
    char *tok;
    /* string to parse */
    char str[] = "123,465,798";

    int sum = 0, num;

    /* get first token, warning `str` is modified */
    tok = strtok(str, delim);
    while (tok)
    {
        /* convert token to int */
        num = strtol(tok, NULL, 0);

        /* add it to sum */
        sum += num;

        /* read next token */
        tok = strtok(NULL, delim);
    }
    printf("sum is %d\n", sum);
    return 0;
}

答案 3 :(得分:0)

int main() {

    int i;  // index

    int iGroup=0;// groupNumber array

    int num=0, sum=0;       // number
    char str[]="123,456,789";
    char strNum[16];
    memset(&strNum[0], 0, sizeof(strNum));

    for(i=0; str[i]!='\0'; i++) {
        if (str[i] == ',' ) { // Get the group number array since the numbers 

            iGroup=0;                     //Reset the index of the groupNumber array
            num=atoi(strNum);                 //Convert the array to numbers
             memset(&strNum[0], 0, sizeof(strNum)); //Set the groupNumber array to null 
                   sum += num; 
        } else { // a digit
            strNum[iGroup]=str[i];             //Add the character to groupNumber array
            iGroup++;
        }
    }
       num=atoi(strNum); 
       sum += num;
    //sum += num; 
    printf("Sum of all values in CSV[%s] : %d", str, sum);

    return 0;
}

答案 4 :(得分:0)

以下是strtol()strspn()不会修改输入字符串的解决方案:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int sum_csv(const char *str) {
    int sum = 0;
    for (;;) {
        char *p;
        int n = strtol(str, &p, 10);  /* convert number */
        if (p == str)                 /* stop if no number left */
            break;
        sum += n;                     /* accumulate (ignore overflow) */
        str = p + strspn(p, ", ");    /* skip number and delimiters */
    }
    return sum;
}

int main(void) {
    printf("sum is %d\n", sum_csv("123,465,798");
    return 0;
}