2017-06-15 18 views
1

我想從用戶那裏得到一個全名,並顯示他的名字縮寫,這樣的事情:如何在C中縮寫全名?

「Edward Cantrell Cavender Davis」 --> Name the user entered 

"DAVIS, E. C. C.」 -- Name abbreaviated 

的問題是,我不知道該怎麼做,在C是新的,我我想,如果有一些圖書館可以做到這一點,也許。

用戶可以輸入的最大大小名稱是200,我需要通過函數檢查它並顯示名稱縮寫。

我的代碼:(我被困在這裏)

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

void name_abbreviated (char name[200]) { 

} 

int main() { 
    char name[200]; 
    printf("Type a full name : "); 
    gets(name); 
    name_abbreviated(name); 
} 
+0

我會做的第一件事是用空格字符拆分名稱字符串,所以你會從'Edward Cantrell Cavender Davis'創建4個字符串。一旦將該字符串拆分爲子字符串,只需根據順序應用您的邏輯(即第一個子字符串需要縮寫,最後一個子字符串需要保留)。你不需要一個庫來做到這一點,因爲你已經在使用'' –

+0

是我的想法,我試圖在這裏做,如果我得到了,我會發布代碼。感謝您的幫助。 – Monteiro

+4

你的問題太寬泛,你真的要求我們爲你編碼。你提出了一個很好的問題,但是你的問題還不夠具體。 – Stargateur

回答

2

我在想,如果有一些庫,這是否

沒有沒有。你必須編寫自己的代碼來實現這一點。


的算法,我可以用如下:

  1. 找到最後一個空格(標誌其指數),並提取姓氏。
  2. 循環遍歷name,直到出現空白(您的索引已經爲 )。每次遇到一個空間時,將該字的首字母 存儲到緩衝區中。

代碼:

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

#define LEN 200 

void name_abbreviated (char name[]) { 
    //printf("|%s|\n", name); 
    char last_name[20]; 
    int j = 0, last_space_idx; 
    for(int i = strlen(name) - 1; i >= 0; --i) 
    { 
     if(name[i] == ' ') 
     { 
      last_space_idx = i; 
      while(name[i]) 
       last_name[j++] = name[++i]; 
      last_name[j] = '\0'; 
      break; 
     } 
    } 
    //printf("|%s|\n", last_name); 
    char rest_name[15]; 
    rest_name[0] = name[0]; 
    rest_name[1] = '.'; 
    rest_name[2] = ' '; 
    j = 3; 
    for(int i = 3; i < last_space_idx; ++i) 
    { 
     if(name[i] == ' ') 
     { 
      rest_name[j++] = name[i + 1]; 
      rest_name[j++] = '.'; 
      rest_name[j++] = ' '; 
     } 
    } 
    rest_name[j - 1] = '\0'; 
    //printf("|%s|\n", rest_name); 
    printf("%s, %s\n", last_name, rest_name); 
} 

int main() { 
    char name[LEN]; 
    printf("Type a full name : "); 
    fgets(name, LEN, stdin); 
    printf("\n"); 
    name_abbreviated(name); 
    return 0; 
} 

輸出:

Type a full name : 
Davis, E. C. C. 

或者,如果你喜歡看Live demo

+1

謝謝,它工作完美。我是C新手,所以這個解決方案有點複雜,從來不會想到這個。我認爲把所有的字符串分開並使用其他方法,但是你的更好。無論如何,+1和最佳評論投票。 – Monteiro

+1

輕微:OP的char名稱[200]; ...獲得(名稱);'暗示沒有''\ n''的'name',所以推薦'#define LEN'200 + 1)'並且關掉任何尾隨的''\ n'。 – chux

+0

感謝提醒,我將在代碼中改變這一點。 – Monteiro

1

與數據結構的幫助稱爲鏈表

struct name { 
    char string[200]; 
    struct name *next; 
} 

void name_abbreviated(char *input) 
{ 
    struct name first; 
    struct name *p = &first; 
    struct name *last; 

    int i = 0; 
    while (sscanf(input, "%199s", p->string) != EOF) { 
     i++; 
     last = p; // keep pointer to possible last name 

     input += strlen(p->string) + 1; // advance input, +1 for space 

     p->next = malloc(sizeof(struct name)); 
     p = p->next; 
    } 

    // print last name 
    printf("%s,", last->string); 

    // print rest 
    int j; 
    p = &first; 
    for (j = 0; j < i - 1; j++) { 
     printf(" %c.", p->string[0]); 
     p = p->next; 
    } 
    printf("\n"); 

    // free malloced memories 
    struct name *prev = NULL; 
    p = first.next; 
    while (p) { 
     prev = p; 
     p = p->next; 
     free(prev); 
    } 
} 

int main() 
{ 
    char name[200]; 
    printf("Type a full name: "); 
    fgets(name, 200, stdin); 
    name_abbreviated(name); 
} 
1

我覺得這裏的答案,沒有真正充分利用C庫多,所以我決定展示另一種方式。如果你是C的新手,我真的推薦閱讀代碼並閱讀手冊頁(在終端中鍵入man [命令]並閱讀文檔),以瞭解您不熟悉的每個函數。具體來說,看看我使用sprintf()在for循環。理解爲什麼這是C中的一個巨大進步。我還建議閱讀Kernighan和Ritchie編着的The C Programming Language。你不僅會成爲一個更好的C程序員,而且會成爲一個更好的程序員。

單詞是一個字符串數組,其中每個字符串都是名稱中的一個單詞。在你的例子中,該陣列將是:

words[0] = "Edward" 
words[1] = "Cantrell" 
words[2] = "Cavender" 
words[3] = "Davis\n" 

*注意在最後一個單詞結尾的新行字符。getline()返回原始的用戶輸入,並且由於用戶按下Enter鍵來表示輸入結束,新的行字符將貫穿始終。

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

#define LEN 200 

void name_abbreviated(char *name) { 
    char tmp[LEN+1], abbr[LEN], *words[LEN], *token; 
    int i = 0; 

    strncpy(tmp, name, LEN); 

    token = strtok(tmp, " "); 
    while (token) { 
     words[i++] = token; 
     token = strtok(NULL, " "); 
    } 

    // remove '\n' from last word 
    words[i-1][strlen(words[i-1]) - 1] = '\0'; 

    sprintf(abbr, "%s, ", words[i-1]); 
    for (int j = 0; j < i - 1; j++) 
     sprintf(abbr + strlen(abbr), "%c. ", words[j][0]); 

    puts(abbr); 
} 


int main(void) { 
    char *name = NULL; 
    char *abbr; 
    size_t linecap = LEN; 
    printf("Type a full name : "); 
    getline(&name, &linecap, stdin); 
    name_abbreviated(name); 
}