2016-10-19 6 views
1

Я хочу знать, как конвертировать, например, эту строку:Как преобразовать полное имя в название библиографического формата в C?

«Барак Обама» на «ОБАМА, Барак».

I.e., в библиографическом формате, например, когда кто-то пишет книгу/статью. Но я хочу знать, как преобразовать любое имя в этом формате, это могут быть два имени (как было раньше) или имена 3, 4, 5 ... n, например:

Lionel Andrés Blablabla Soccer Player Messi

Это имя будет: MESSI, Lionel Andrés Blablabla Soccer Player.

Я знаю, как это сделать, если я знаю, сколько имен будет иметь полное имя, но я хочу знать, как я могу это сделать для полного имени, которое я не знаю, сколько имен у него будет.

Вот что у меня до сих пор (работает только 6 имен в примере ниже):

char nome[30][100]; 
int i, j; 

for(i = 0; i < 6; i++) 
    scanf("%s", nome[i]); 
for(j = 5; j > 4; j--) 
    printf("%s,", strupr(nome[j])); 
for(i = 0; i <= 4; i++) 
    printf("%s ", nome[i]); 
+0

DE MELLO, Энтони " Тони" –

ответ

0

Если формат является относительно простым (вы, кажется, указывают на это с вашим комментарием «любого вида имя в это формата "), вы можете использовать следующий подход:

  1. используйте strrchr(), чтобы найти последнее место в строке. Очевидно, что персонажи за пределами этой точки составляют фамилию.
  2. Поэтому персонажи до этот пункт составляет все имена не часть фамилии.
  3. Итак, вы просто распечатываете фамилию, запятую и пробел, затем более раннюю часть строки.

Теперь, при условии, существуют всевозможные краевые кейсы, которые могут возникнуть, если ваши входные строки не так красиво отформатированы, такие как конечные пробелы, фамилии, состоящие из более чем одного слова, и поэтому на.


С точки зрения фактического кода, следующая программа будет хорошей отправной точкой:

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

int main(void) { 
    static char buffer[1000]; 

    while (1) { 
     // Get line from user. 

     printf ("\nEnter name> "); 
     if (fgets(buffer, sizeof(buffer), stdin) == NULL) { 
      printf("\n*** End of file, stopping.\n"); 
      return 0; 
     } 

     // Remove any trailing newline. 

     if ((*buffer != '\0') && (buffer[strlen(buffer) - 1] == '\n')) 
      buffer[strlen(buffer) - 1] = '\0'; 

     // Find last space. If none, output as is. 

     char *lastSpace = strrchr(buffer, ' '); 

     if (lastSpace == NULL) { 
      printf ("  --> %s\n", buffer); 
      continue; 
     } 

     // Otherwise separate, capitalise surname and output all. 

     *lastSpace++ = '\0'; 

     for (char *surchar = lastSpace; *surchar != '\0'; surchar++) 
      *surchar = toupper(*surchar); 

     printf ("  --> %s, %s\n", lastSpace, buffer); 
    } 

    return 0; 
} 

Образец запуска этого показан ниже:

Enter name> bob 
     --> bob 

Enter name> allan 
     --> allan 

Enter name> Barack Obama 
     --> OBAMA, Barack 

Enter name> Lionel Andres Blablabla Soccer Player Messi 
     --> MESSI, Lionel Andres Blablabla Soccer Player 

Enter name> <CTRL-D pressed> 
*** End of file, stopping.