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ます。さらに、の2番目のパラメーターは、 (単一文字)ではなく(nullで終了する文字列)である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の2番目のパラメータはです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

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 に答える
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 に答える