我觉得这里的答案,没有真正充分利用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