2016-07-24 1 views
3

나는 당신의 이름을 취하고 표준 형식으로 출력을 제공하는 기본 프로그램을 개발하려고합니다. 문제는 사용자가 중간 이름을 추가하지 않을 수있는 옵션을 갖기를 원한다는 것입니다.표준 형식으로 이름 인쇄하기

예 : Carl Mia Austin이 나에게 M. M. Austin을주었습니다. 그러나 입력이 Carl Austin이라 할지라도 사용자에게 중간 이름이 있는지 묻지 않고 C. Austin을 제공해야합니다. 그래서 자동으로 감지 할 수있는 방법이나 기능이 있습니까 ?? 로 현재 작성

#include <stdio.h> 

int main(void) { 
    char first[32], middle[20], last[20]; 

    printf("Enter full name: "); 
    scanf("%s %s %s", first, middle, last); 
    printf("Standard name: "); 
    printf("%c. %c. %s\n", first[0], middle[0], last); 

    return 0; 
} 

답변

7

, scanf("%s %s %s", first, middle, last); 3 개 부분을 입력해야하고 사용자 유형들을 때까지 기다리는 것으로 기대하고있다.

당신은 fgets()으로 입력 라인을 읽고 sscanf와 이름 부분에 대한 것을 검색하고 변환 얼마나 많은 부품을 계산하려면 : 이름은 실제 생활에서 좀 더 다양한 될 수

#include <stdio.h> 

int main(void) { 
    char first[32], middle[32], last[32]; 
    char line[32]; 

    printf("Enter full name: "); 
    fflush(stdout); // make sure prompt is output 
    if (fgets(line, sizeof line, stdin)) { 
     // split the line into parts. 
     // all buffers have the same length, no need to protect the `%s` formats 
     *first = *middle = *last = '\0'; 
     switch (sscanf(line, "%s %s %[^\n]", first, middle, last)) { 
     case EOF: // empty line, unlikely but possible if stdin contains '\0' 
     case 0: // no name was input 
      printf("No name\n"); 
      break; 
     case 1: // name has a single part, like Superman 
      printf("Standard name: %s\n", first); 
      strcpy(last, first); 
      *first = '\0'; 
      break; 
     case 2: // name has 2 parts 
      printf("Standard name: %c. %s\n", first[0], middle); 
      strcpy(last, middle); 
      *middle = '\0'; 
      break; 
     case 3: // name has 3 or more parts 
      printf("Standard name: %c. %c. %s\n", first[0], middle[0], last); 
      break; 
     } 
    } 
    return 0; 
} 

참고 : 외국 이름을 멀티 바이트 문자로 생각하거나 단순히 빌 게이츠라고도하는 William Henry Gates III으로 생각할 수도 있습니다. 위의 코드는 후자를 처리하지만이 하나 Éléonore de Provence, 헨리 III, 잉글랜드의 왕, 1223의 젊은 아내 - 1291

+0

이 코드의 유일한 problemI 자체는 의미 @chqrlie입니다. 그 사람이 중간 이름을 가지고 있지는 않지만 처음과 마지막 이름 만 입력하면, 성은 중간 이름으로 해석됩니다. – user3078414

+0

@ user3078414 : 귀하의 의견에 무슨 뜻인지 모르겠습니다. 사용자가 2 부분으로 만 이름을 입력하면'first'와'middle' 만'sscanf()'에 의해 변환되고 * 표준 이름 *이'first'와'full' 중간의 처음으로 인쇄됩니다. 그것은 정말로 성입니다. 이 세 배열의 이름을'part1','part2' 및'part3'로 변경하면 혼동을 줄일 수 있습니다. – chqrlie

+0

귀하의 반응에 감사드립니다, @ chrrlie. 데이터를 구성하고 필요한 데이터베이스에 복사 할 준비를하는 코드를 생각하고 있습니다. 나는 누군가가'printf()'를 먹이는 것과 같은 코드를 필요로한다고 생각하지 않는다. (- : – user3078414

0

당신은 isspace을 사용하고 이름에 공백 찾을 수 :

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

int main(void) 
{ 
    char first[32], middle[32], last[32]; 
    int count=0; 
    int i = 0; 
    printf("Enter full name: "); 
    scanf(" %[^\n]s",first); 
    for (i = 0; first[i] != '\0'; i++) { 
     if (isspace(first[i])) 
      count++; 
    } 
    if (count == 1) { 
     int read = 0; 
     int k=0; 
     for (int j = 0; j < i; j++) { 
      if (isspace(first[j])) 
       read++; 
      if (read > 0) { 
       last[k]=first[j]; 
       k++; 
      } 
     } 
     last[k+1] = '\0'; 
    } 
    printf("Standard name: "); 
    printf("%c. %s\n", first[0], last); 

    return 0; 
} 

테스트

Enter full name: Carl Austin 
Standard name: C. Austin 
+0

두명의 이름으로 어떻게되는지 테스트 해봐야 할 것 같아요. – usr2564301

+0

'scanf' 패턴에 길잃은 "s"가 있습니다.하지만 어쨌든'fgets'을 사용하는 것이 더 나을지도 모릅니다. – anatolyg