0

2 つの文字列があり、1 つは電子メール アドレスで、もう 1 つは空です。たとえば、メール アドレスが の場合、メール アドレス"abc123@gmail.com"の先頭の の直前@を 2 番目の文字列に渡す必要があります。例えば:

最初の文字列:"abc123@gmail.com"

2 番目の文字列:"abc123"

ループを作成しましたが、機能しません:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char email[256] = "abc123@gmail.com";
char temp[256];
int i = 0;

while (email[i] != '@')
{
      temp = strcat(temp, email[i]);
      i++;
}

printf ("%s\n", temp);
system ("PAUSE");
return 0;
}

基本的に、毎回メールアドレスから 1 文字を取り出し、それを新しい文字列に追加しました。たとえば、新しい文字列に が付いている場合は、...bを使用してそれを付けます。strcat

4

4 に答える 4

2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
char email[256] = "abc123@gmail.com";
char temp[256];
size_t i = 0;

#if 0
for (i=0; email[i] && email[i] != '@'; i++) {;}

   /* at the end of the loop email[i] is either the first '@',
   ** or that of the terminating '\0' (aka as strlen() )
   */

#else

i = strcspn(email, "@" );

   /* the return value for strcspn() is either the index of the first '@'
   * or of the terminating '\0'
   */

#endif

memcpy (temp, email, i);
temp[i] = 0;


printf ("%s\n", temp);
system ("PAUSE");
return 0;
}

更新:まったく異なるアプローチは、ループ内でコピーを行うことです(これはOPの意図だったと思います):

for (i=0; temp[i] = (email[i] == '@' ? '\0' : email[i]) ; i++) {;}
于 2012-06-09T12:31:28.683 に答える
2

この問題を解決するためのより良い方法があります (たとえば、@(strcspnまたはその他の方法で) のインデックスを見つけて a を実行するなどmemcpy)、この方法はほとんど機能しないため、いくつかの小さな調整を行うことができます。


他の人が特定したように、問題は次の行にあります。

temp = strcat(temp, email[i]);

iおそらく、 の番目の位置にある文字をemailの対応する位置にコピーしようとしていますtemp。ただし、strcatこれは正しい方法ではありません。strcatデータを 1char*から別のchar*にコピーします。つまり、文字列をコピーします。1 つの文字をコピーしたいだけで、まさにそのとおり=です。

より高いレベルから見ると (答えだけを説明しないように)、 の適切な文字を の適切な文字に設定tempする必要があります ( と の両方にインデックスemailを付けるために を使用する必要があります)。iemailtemp

また、C の文字列は で終了する必要があるため、文字列のコピーが終了したら'\0'、次の文字を に設定するtemp必要があります。'\0'(この考え方では、電子メール文字列に が含まれていない場合に何が起こるかを考慮する必要があり@ます。whileループは文字列の末尾を超えて進み続けます。文字列の末尾にいるemailかどうかがわかることを覚えておいてください。条件として、character == '\0'または条件として使用するだけcharacterです。)

于 2012-06-09T12:54:50.253 に答える
2

ポインター。まず、strcat() は char ポインターを返します。これは、何らかの理由で C が char 配列としてキャストできません (すべての C プログラマーが知っておく必要があると聞いています)。次に、strcat() の 2 番目の引数は、char ポインターではなく、char ポインターであると想定されています。

に置き換えるtemp = strcat(temp, email[i]);temp[i] = email[i];うまくいくはずです。

また、ループの終了後、文字列をヌル文字で終了します。

temp[i] = '\0';

(ループが終了した後、i抽出された文字列の長さに等しいためtemp[i]、端末が移動する場所になります。)

于 2012-06-09T12:57:08.060 に答える
0

strtok()を使用してみてください

于 2012-06-09T12:30:46.543 に答える