如何在字符串中添加所有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;
}
答案 0 :(得分:3)
有很多方法可以解决这个问题。首选只是使用strtol
作为预期目的,并使用endptr
参数迭代字符串,以便在成功转换后的最后一位数字后将字符串中的位置更新为1。
但是,学习使用数组索引(或者最好是指针)来迭代字符串以解析字符串所需的内容是很有价值的。用一对指针 inch-worming 进行解析是没有什么太复杂的了,你可以选择你想要的东西。
此处似乎您想循环遍历字符串中的每个字符,测试逗号或数字,并采取相应的操作将数字添加到number
,或添加您的如果遇到逗号,则number
到sum
。不要忘了你必须将字符的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
和一对指针(p
和ep
- 指针和结束,向下走一下字符串-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)
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;
}