我试图对一些字符串进行标记,以便数字本身是令牌,所以我最终可以添加它们,但我的标记化不起作用,我不知道为什么。它正确编译但是当我执行文件时它会说"分段错误",任何人都知道为什么或如何将这个数字作为令牌?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int stringSum(char *s);
/*void minMaxValues(char *s, int *min, int *max);*/
int main(void)
{
int value,i;
char* text[] = { "1 + 2 + 3 + 4",
"7",
"30 + 20 + 10",
"9 + 900 + 90000 + 9000 + 90" };
for(i=0;i<4;i++) /*send strings to function*/
stringSum(text[i]);
}
int stringSum(char *s)
{
char* del = " + ";
char* token;
token = strtok(s,del);
while(token != NULL)
{
printf("%s\n",token);
token = strtok(NULL, del);
}
}
答案 0 :(得分:1)
strtok
需要可修改的字符串。您在main
中定义了一组不可修改的字符串文字,因此他们无法使用strtok
。
要获得快速解决方案,请使用:
char* temp = malloc(strlen(s) + 1);
strcpy(temp, s);
token = strtok(temp,del);
这会动态分配一个可修改的字符串,其值与您在s
中可以使用的strtok
相同。
由于这是一个动态分配的变量,请记住在方法结束时释放内存:
free(temp);
您修改后的stringSum
方法现在应如下所示:
int stringSum(char *s)
{
char* del = " + ";
char* token;
char* temp = malloc(strlen(s) + 1);
strcpy(temp, s);
token = strtok(temp,del);
while(token != NULL)
{
printf("%s\n",token);
token = strtok(NULL, del);
}
free(temp);
return 0; //or whatever it is that you want to return
}
答案 1 :(得分:0)
函数strtok
修改原始字符串。尝试传递char s[]
而不是char* s
和
为什么我们使用char s[]
?
从此处查看char pointer
与char array
之间的差异(What is the difference between char s[] and char *s?)
答案 2 :(得分:0)
token = strtok(s,del);
在strtok
函数的规范中,s
必须是可写的,但在您的示例中,它是字符串文字。
char* text[] = { "1 + 2 + 3 + 4",
"7",
"30 + 20 + 10",
"9 + 900 + 90000 + 9000 + 90" };
text
数组中的所有字符串都是字符串文字,因此无法修改。
答案 3 :(得分:0)
更改第一个参数是非法的strtok是字符串文字不能改变。
替代方案:
#include <stdio.h>
#include <stdlib.h>
int stringSum(const char *s);
int main(void){
int value, i, size;
char *text[] = { "1 + 2 + 3 + 4",
"7",
"30 + 20 + 10",
"9 + 900 + 90000 + 9000 + 90"
};
size = sizeof(text)/sizeof(*text);
for(i=0;i<size;i++)
stringSum(text[i]);
return 0;
}
int stringSum(const char *s){
int sum = 0;
char *endp;
do{
int num = strtol(s, &endp, 10);
if(*endp == ' ' || *endp == '+' || *endp == '\0'){
sum += num;
if(*endp)
s = ++endp;
} else { //s has invalid character
fprintf(stderr, "Illegal characters are included.\n");
break;
}
}while(*endp);
printf("%d\n", sum);
return sum;
}