2

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

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

4 回答 4

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);
于 2012-09-27T15:23:50.830 回答
2

strcspn(str1, '?');

是一个错误,strcspn' 的第二个参数是 a const char*,传递一个字符常量几乎肯定会导致未定义的行为和分段错误(您的程序不太可能在其地址空间中有地址 63('?' 的 ASCII 值) ,如果有,它不太可能指向一个以 0 结尾的字符数组)。

p = strpbrk(str1, "?");
strcpy(str2, p+1);

应该工作。如果您想以str1“?”结尾,则*p = 0;覆盖“?” 使用 0。当然,通常情况下,您应该在使用之前验证它strpbrk不会返回。NULLp

于 2012-09-27T15:23:32.167 回答
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);
于 2012-09-27T15:27:30.820 回答
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';
}

我希望这能帮到您。

于 2012-09-27T15:29:57.800 回答