2017-02-16 10 views
2

文字ポインタを取得して電子メールを格納し、そのポインタを関数に渡して特殊文字があるかどうかを確認する必要がある問題を解決しようとしています入力文字列内の文字。私は私の機能への文字ポインタが(検証)と、文字列を印刷しようとするたびに渡す は、ここでは、コード関数に文字ポインタを渡す方法

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

void verify(char** em) 
{ 
    char *z = *em; 

    while(*z) 
    { 
     printf("%c", *z++); 
    } 

    while(*z != '\n') 
    { 
     if(*z == 'a') 
     { 
      printf("present"); 
      *z++; 
     } 
     else 
     { 
      printf("not present"); 
     } 
    } 
} 

int main() 
{ 
    int count = 0; 
    char *email = malloc(sizeof(char) * 100); 

    printf("enter the email id\n"); 
    scanf("%100s", email); 

    while(*email) 
    { 
     printf("%c", *email++); 
    } 

    verify(&email); 
    return 0; 
} 

ですが、私は必要な出力を得ることはありません。

入力メールが有効かどうかを確認するにはどうすればよいですか? 私は '@'のインデックスを見つけようとしていて、@の前と@の前の文字をチェックしようとしていますが、配列ではないため '@'のインデックスをどのように格納できますか。

+0

これ以外の処理を行う前に、コードを適切に書式設定してインデントする必要があります。 –

+1

投稿の質問とは関係ありません。ちょうどあなたがメモリリークを起こしている可能性があります。 'malloc'の各部分について、あなたがそれを解放することを確認してください。 –

+0

あなたの 'scanf()'はフィールドの幅に終端ヌルが含まれていないので 'scanf("%99s "、email)'でなければなりません。また、なぜ一度に1文字ずつヌル終了文字列を出力していますか? – Dmitri

答えて

1

通報1本の

while(*email) 
    printf("%c",*email++); 

移動emailそれはループの最後に文字列の末尾を指すように。 emailの元の値を記録しておく必要があります。

char* it = email; 
while(*it) 
    printf("%c",*it++); 

問題2

あなたはmallocへの呼び出しに入ったメモリの割り当てを解除されていません。

通報3本の

while(*z) 
    printf("%c",*z++); 

移動zそれはループの最後に文字列の末尾を指すように。文字列の先頭を指すようにリセットする必要があります。問題となっている

問題4

そして、あなたは

if(*z=='a') 
    { 
    printf("present"); 
    *z++; 
    } 

を持っています。 z*z'a'でないと移動しません。

verifyを修正:

mainを固定
// You don't need the input to be of type char** 
void verify(char* em) 
{ 
    char *z = em; 
    while(*z) 
     printf("%c",*z++); 

    // Reset where z points 
    z = em; 

    while(*z!='\n') 
    { 
     if(*z=='a') 
     { 
     printf("present"); 
     } 
     else printf("not present"); 

     // Move z regardless of the value of *z 
     ++z; 
    } 
} 

:?

int main() 
{ 
    int count=0; 
    char *email=malloc(sizeof(char)*100); 
    printf("enter the email id\n"); 
    scanf("%100s",email); 

    char* it = email; 
    while(*it) 
     printf("%c",*it++); 

    // Just use email, not &email 
    verify(email); 

    // Deallocate memory 
    free(email); 

    return 0; 
} 
+0

あなたはなぜこれを使用したのか説明できます// Reset z点を指定します z = em; – nitishy2j

+0

'while'ループの前に、' z'は文字列の最初の文字を指します。ループが終了した後、 'z'は文字列の最後の文字を指します。 'z = em;'を使うことによって、 'z'は文字列の最初の文字をもう一度指します。 –

+0

私はそれを編集したこの質問を見てください – nitishy2j

0

は* ++が使用しません。 *?、?++、*?、(*?)++のようなものであるかどうかは分かりません。

void verify(char* em){ 
char *z = em; 
while(*z) 
printf("%c",*(z++));//do you realy need to print the email more than once? 
//in the verify() and the main() 
// Reset where z points 
z = em; 

    while(*z!='\n'&&*z!='\0') 
    { 
    if(*z=='a') 
    { 
    printf("present"); 
    } 
    else printf("not present"); 

    // Move z regardless of the value of *z 
    ++z; 
    } 
    } 


int main() 
{ 
int count=0; 
char *email=malloc(sizeof(char)*100); 
printf("enter the email id\n"); 
scanf("%100s",email); 

char* it = email; 
while(*it) 
    printf("%c",*(it++)); 

// Just use email, not &email 
verify(email); 

// Deallocate memory 
free(email); 

return 0; 
} 
関連する問題