Заглавная буква первой буквы строки в c - код функции myprintf длиной до 110 символов - PullRequest
1 голос
/ 05 апреля 2019

Мне нужно сделать функцию my_printf, которая принимает строку, использует только первую букву строки (даже если перед ней есть пробелы), а затем выполняет \ n, не более 110 символов (пробелы / табуляции нев комплекте).

Я могу изменить функцию только между комментариями «НАЧАТЬ СДЕЛАНО НАЧАТЬ» И «НА СЛОВИТЬ ЗАВЕРШЕНИЕ».

Это код, который я написал до сих пор:единственная проблема, с которой я столкнулся, заключается в том, что в выходных данных она не использует заглавную букву «l» из «выглядит нормально :)» после \ t, и я понятия не имею, как реализовать использование заглавной буквы в символе, не находящемся в позиции q[0] строки без превышения максимального ограничителя в 110 символов в этом коде;Я знаю, что это требует петли, но я всегда, кажется, переступаю предел.

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

void my_printf(char*p){
    char s[strlen(p)+1], *q=s;
    strcpy(s,p);

    /* TO BE DONE START */
    q[0]=toupper(q[0]);
    putchar(q[0]);
    for(*q=1;*q!='\0';++q) {
         putchar(*q);
    }
    putchar('\n');

    /* TO BE DONE END */
}

int main(){
    my_printf("hello world!");
    my_printf("How are you?");
    my_printf("i\'m OK, and you?");
    my_printf("1, 2, 3, testing ...");
    my_printf("\t  looks OK :-)");
    my_printf("bye bye!");
    return 0;
}

Мне нужна помощь в том, чтобы сделать этот код как можно короче, вот желаемый вывод:

 Hello world!
 How are you?
 I'm OK, and you?
 1, 2, 3, testing …
            Looks OK :-)
 Bye bye!

Пока у меня есть:

 Hello world!
 How are you?
 I'm OK, and you?
 1, 2, 3, testing …
            looks OK :-)
 Bye bye!

Ответы [ 3 ]

3 голосов
/ 05 апреля 2019

Вы можете использовать функцию isspace - что-то вроде:

/* TO BE DONE START */
while (isspace(*q)) putchar(*q++);
for(*q = toupper(*q); *q; ) putchar(*q++);
putchar('\n');
/* TO BE DONE END */
2 голосов
/ 05 апреля 2019

Обратите внимание, что аргумент char для isspace() и tolower() должен быть должен быть преобразован в unsigned char, чтобы избежать неопределенного поведения отрицательных значений char на платформах со знаком char. Ваш код и все другие решения имеют эту проблему.

Вот короткий, который не изменяет массив (98 символов):

/* TO BE DONE START */
while (isspace((unsigned char)*q)) putchar(*q++);
if (*q) putchar(toupper((unsigned char)*q++));
puts(q);
/* TO BE DONE END */

Еще короче, модифицирующий s (75 символов):

/* TO BE DONE START */
while (isspace((unsigned char)*q)) q++;
*q = toupper((unsigned char)*q));
puts(s);
/* TO BE DONE END */
1 голос
/ 05 апреля 2019

Это заставляет меня чувствовать себя грязным:

/* TO BE DONE START */
int f = 1;
while (*q) {
  if (f && !isspace(*q))
    *q = toupper(*q), f=0;
  putchar(*q++);
}
putchar('\n');
/* TO BE DONE END */

84 непробельных символа.

Обратите внимание на использование оператора запятой, чтобы избежать сохранения символа {}.

(Предполагается, что char не подписано или если подписано, что в строке, которую он принимает, никогда не будет отрицательного значения.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...