我覺得這裏的答案,沒有真正充分利用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);
}
我會做的第一件事是用空格字符拆分名稱字符串,所以你會從'Edward Cantrell Cavender Davis'創建4個字符串。一旦將該字符串拆分爲子字符串,只需根據順序應用您的邏輯(即第一個子字符串需要縮寫,最後一個子字符串需要保留)。你不需要一個庫來做到這一點,因爲你已經在使用'' –
是我的想法,我試圖在這裏做,如果我得到了,我會發布代碼。感謝您的幫助。 – Monteiro
你的問題太寬泛,你真的要求我們爲你編碼。你提出了一個很好的問題,但是你的問題還不夠具體。 – Stargateur