2017-04-05 75 views
1

所以我有一個問題。我必須分開電子郵件的名字,姓氏和主機名。 例如:奇怪的形狀作爲輸出(字符串) - C語言

[email protected] >>輸入

輸出=

名字=西風

姓=極端

主機名=的Gmail .com

我沒有得到想要的結果。我得到一些奇怪的形狀作爲輸出。

代碼:

#include <stdio.h> 

int main() 
{ 
char email[40], first[20],last[20],host[30]; 
printf("Enter the email= "); 
gets(email); 
int i; 
while(email[i]!='\0') 
{ 
    while(email[i]!='.') 
    { 
     first[i]=email[i]; 
     i++; 
    } 
    while(email[i]!='@') 
    { 
     last[i]=email[i]; 
     i++; 
    } 
    while(email[i]!='\0') 
    { 
     host[i]=email[i]; 
     i++; 
    } 
} 
puts(first); 
puts(last); 
puts(host); 
} 
+1

您可以發佈您的輸出嗎?知道這些「奇怪的形狀」可能會幫助很多。 –

+0

另外,你應該檢查'gets'的返回值。 'gets'返回一個'NULL'指針,以防萬一找到EOF而不讀取任何字符。 (事實上​​,你根本不應該使用'gets' - 'gets'不能保護你免受緩衝區溢出的影響) –

+0

然後我應該使用什麼,除了得到 –

回答

0

假設格式將永遠是[email protected] ......,使用此代碼:

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

int main() 
{ 
    char email[40], first[20],last[20],host[30],name[40]; 
    int firstDot,atSymbol; 
    int i; 
    int length; 
    char *token; 

    printf("Enter the email= "); 
    gets(email); 
    length = strlen(email); 
    for(i=0;i<length;i++){ 

     if(email[i]=='.') 
     { 
      firstDot = i; 
     } 
     else if(email[i]=='@') 
     { 
      atSymbol = i; 
     } 
    } 
    strncpy(name,email,atSymbol); 
    name[atSymbol]= '\0'; 
     token = strtok(name, "."); 

     /* walk through other tokens */ 
     while(token != NULL) 
     { 
      printf("%s\n", token); 
      token = strtok(NULL, "."); 
     } 
     strncpy(host,email+atSymbol,length-atSymbol); 
    host[length-atSymbol] = '\0'; 
    puts(host); 
} 
+0

工作正常。但我無法理解最後一次循環。我瞭解strncopy(姓名,電子郵件,atsymbol)部分。但接下來會發生什麼,我無法得到它。 –

+0

請閱讀strtok的文檔:http://en.cppreference.com/w/c/string/byte/strtok –

0

所以我更新的代碼,現在唯一的問題是最後的輸出。

主機名= gmail.com打印完畢後,又打印了一些額外的圖形。這些是微笑的臉和一些怪異的符號。

代碼

#include <stdio.h> 

int main() 
{ 
char email[40], first[20],last[20],host[30]; 
printf("Enter the email= "); 
gets(email); 
int i=0,j; 
while(email[i]!='.') 
{ 
    first[i]=email[i]; 
    i++; 
} 
i=0; 
while(email[i]!='@') 
{ 
    last[i]=email[i]; 
    i++; 
} 
j=i; 
i=0; 
while(email[j]!='\0') 
{ 
    host[i]=email[j]; 
    j++; 
    i++; 
} 
printf("First Name= "); 
puts(first); 
printf("Last name= "); 
puts(last); 
printf("Host name= "); 
puts(host); 
} 
0

C字符串(char指針)應該是null-terminated。這意味着您的字符串在其末尾需要'\0'字符,以便字符串處理函數(如putsstrlen)知道它們結束的位置,與字符串長度與其一起存儲的其他語言相反。你看到的「怪異形狀」只是在字符串結尾被存儲爲字符後存儲的隨機數據。當你調用puts它只是不斷輸出字節,如字符,直到它隨機找到與值的字節'\0'

你寫一個可以通過每個塊的後面添加一個'\0'字符的字符串的結尾解決這個問題串。

while(email[i]!='.') 
{ 
    first[i]=email[i]; 
    i++; 
} 
email[i] = '\0'; //same thing as email[i] = 0; but using a char makes what 
       //you're doing clearer 
+0

非常感謝。 +1 –

+0

嗨,剛剛注意到你不接受我的答案。你有什麼問題嗎? –

+0

不,因爲我只能選擇一個答案。 –