根据char位置将字符串拆分为两个

时间:2012-09-27 15:15:48

标签: c string c-strings

我需要根据字符的位置将字符串拆分为字符串。那样:

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时出错。必须有一个更好,更实用的方式。有人可以帮我吗?非常感谢......

4 个答案:

答案 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';
}

我希望这会对你有所帮助。