我需要根据字符的位置将字符串拆分为字符串。那样:
str1 =“hello?world”是str1 =“hello”和str2 =“world”
这是我到目前为止所做的:
char str1[100] = "hello?world";
char str2[100];
char *p;
p = strpbrk(str1, "?");
strcpy(&str2, p);
strcspn(str1, '?');
尝试将'p'后的字符复制到str2时出错。必须有一个更好,更实用的方式。有人可以帮我吗?非常感谢......
答案 0 :(得分:3)
&str2
是指向数组[100]
的指针。你确实应该使用str2
的地址。此外,strcspn
的第二个参数应该是"?"
(以空字符结尾的字符串)而不是'?'
(单个字符)。
此外,以下代码工作正常:
#include <stdio.h>
#include <string.h>
char s[] = "hello?world"; /* source string */
char s1[100] = ""; /* first part */
char s2[100] = ""; /* second part */
char *tmp = strchr(s, '?');
if (tmp != NULL) {
*tmp = '\0';
strcpy(s1, s);
strcpy(s2, tmp+1);
}
puts(s1);
puts(s2);
答案 1 :(得分:2)
此
strcspn(str1, '?');
是一个错误,strcspn
的第二个参数是const char*
,传递一个字符常量几乎肯定会导致未定义的行为和分段错误(你的程序不太可能有地址63(ASCII值为'?')在其地址空间中,如果有,则不太可能指向以0结尾的字符数组。)
p = strpbrk(str1, "?");
strcpy(str2, p+1);
应该工作。如果您要在'?'处结束str1
,*p = 0;
会覆盖'?'但是通常情况下,您应该在使用strpbrk
之前验证NULL
是否未返回p
。
答案 2 :(得分:1)
使用strtok()。点击链接查看示例。
做这样的事情:
char src[] = "hello?world";
char str1[100];
char str2[100];
char *p;
p = strtok(src, "?");
strcpy(str1, p);
p = strtok(NULL, "?");
strcpy(str2, p);
答案 3 :(得分:1)
我不太了解stdlib字符串函数,但你可以这样做(你的字符串将是“安全的”,我的意思是你不必分配太多的字节,而只需要所需的字节,这就是为什么代码将是一个有点长):
int main()
{
char *tmp;
char *s1;
char *s2;
char delim;
int i;
int j;
tmp = strdup("hello?world");
delim = '?';
i = 0;
while (s1[i] != delim)
i++;
j = 0;
s1 = malloc(i + 1);
while (j < i)
{
s1[j] = tmp[j];
j++;
}
s1[j + 1] = '\0';
j = 0;
i++;
while (tmp[i])
{
i++;
j++;
}
i = strlen(tmp) - j;
s2 = malloc(j + 1);
j = 0;
while (tmp[i])
{
s2[j] = tmp[i];
j++;
i++;
}
s2[j + 1] = '\0';
}
我希望这会对你有所帮助。