2015-11-30 4 views
-2

Я пытаюсь сделать каждый первый капитал слова, но он игнорирует первое слово и переходит на второй. «apple macbook» должен быть «Apple Macbook», но он дает мне «яблочный Macbook». Если я добавлю printf(" %c", toupper(string[0])); перед циклом for и измените значение p=1 в цикле for, это даст мне правильный результат, но если строка начинается с пробела, то она не удастся. Вот код:C первая буква в верхнем регистре игнорирует первое слово

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
int main() 
{ 
    char string[] = "apple macbook"; 
    int p; 
    for(p = 0; p<strlen(string); p++) 
    { 
     if(string[p] == ' ') 
     { 
      printf(" %c", toupper(string[p+1])); 
      p++; 
     } 
     else 
     { 
      printf("%c", string[p]); 
     } 
    } 
    return 0; 
} 
+0

Очевидно, что код не работает, потому что самая первая буква в строке - это особый случай без пробела перед ним. Вы должны рассматривать этот специальный случай отдельно. Кроме того, вам нужно перебирать от 0 до 'strlen (string) -1', иначе ваша программа всегда будет уничтожать нулевой ограничитель, а затем сбой, когда пробел является последней буквой строки. – Lundin

+2

Вы удивлены? Перед «Яблоком» нет места. –

+0

Вы проверяете пробельный символ в инструкции if. Следующий символ будет преобразован в верхний регистр. Попробуйте 'if (p == 0 || string [p] == '')' –

ответ

5

Простая работа вокруг может быть следующим:

for(p = 0; p<strlen(string); p++) 
    { 
     if(p == 0 || string[p - 1] == ' ') 
     { 
      printf("%c", toupper(string[p])); 
     } 
     else 
     { 
      printf("%c", string[p]); 
     } 
    } 
+0

Очень хорошая идея тоже +1. – gsamaras

+0

@gsamaras: Вы говорите, что изменение строки ввода было такой хорошей идеей ... ':-)' –

+0

Hmmm @MOehm, вы правы, я обновлю свой вопрос! – gsamaras

0

Изменить это:

char string[] = "apple macbook"; 

к этому:

char string[] = " apple macbook"; 

и вы получите то, что хотите.

Причина в том, что в вашем цикле вы ищете пространство для изменения буквы впоследствии.

Однако ответ нияска лучше, поскольку он не изменяет входную строку, а логику вашей программы.

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

Смежные вопросы