我正在尝试编写一个函数,将数组中的字符转换为整数,这样我就可以为每个组生成一个总和或其他数学过程。我知道首先我必须使用strtok去掉空格和'+'。我一直试图首先至少开始让strtok工作,但是当我尝试运行它时它一直说分段错误。
有任何帮助吗?
#include <string.h>
#include <stdio.h>
int main(void)
{
char* string[] = { "10 + 20", "1 + 3 + 6 + 8" };
sum(string[0]);
}
int sum(char* s)
{
char *stringcopy = malloc( strlen(s) + 1 );
char* del = " +";
char* token;
int i;
stringcopy = s; /* 'copy' problem here */
token = strtok(stringcopy, del);
while( token ) {
printf("%s\n", token);
token = strtok(NULL, del);
}
return 11; /* placeholder until I get the sum */
}
答案 0 :(得分:4)
有一个简单的原因strtok
为您提供了细分错误:
您正在字符串文字上运行它,尽管类型char[n]
是一个不可变对象
strtok
修改您运行它的任何字符串!
解决方法很简单:在副本上运行。这里有一个复制字符串的函数(大多数C库提供这个非标准函数为char* strdup(const char*)
:
char* my_strdup(const char* s) {
size_t size = strlen(s)+1;
char* ret = malloc(size);
if(ret)
memcpy(ret, s, size);
return ret;
}
以后不要忘记free()
副本。
你试过这样做,但是在开始一个良好的开始并为malloc
保留字符串的空间之后,你只需通过将指向文字的指针分配给同一个指针来丢弃它(内存泄漏)。 / p>
答案 1 :(得分:1)
这一行不符合你的想法:
textcopy = s; /* making copy for strtok */
这里没有复制字符串。所有发生的事情是,而不是指向刚刚为其分配的内存块的第一个字节(使用malloc( strlen(s) + 1 )
),
textcopy
现在直接指向您作为"10 + 20"
传递给stringSum
的文字字符串s
的第一个字节。
你可能想要像strcpy(textcopy, s)
这样的东西。我之前曾建议过strncpy
; strncpy(textcopy, s, strlen(s)) + 1
可能有效,但(正如评论所解释的)在这种情况下使用似乎毫无意义。
答案 2 :(得分:1)
本声明
textcopy = s; /* making copy for strtok */
不符合您的想法。
实际上我们有一个内存泄漏,因为一开始你分配内存和textcopy得到了存储的第一个字节的地址
char *textcopy = malloc( strlen(s) + 1 );
然后你重新分配了textcopy。
textcopy = s; /* making copy for strtok */
您必须使用标准功能strcpy
strcpy( textcopy, s ); /* making copy for strtok */
如果函数声明为
,也会更好int stringSum(const char* s);
答案 3 :(得分:0)
该行
textcopy = s; /* making copy for strtok */
不会复制s
并将其放入textcopy
。相反,您需要使用:
strcpy(textcopy, s);