c 中字符串首字母大写 - 在 110 个字符以下编写 myprintf 函数

Capitalization of first letter of string in c - Code a myprintf function in under 110 characters

我需要制作一个 my_printf 函数,它接受一个字符串,只将字符串的第一个字母大写(即使之前有空格),然后做一个 \n,全部在 110 个字符以内( spaces/tabs不包括)。

我只能修改注释 "TO BE DONE START" 和 "TO BE DONE END" 之间的函数。

这是我到目前为止编写的代码:我遇到的唯一问题是在输出中它没有将 "looks OK :)" 的字母 "l" 大写在 \t 之后而且我不知道如何在不超过此代码中 110 个字符的最大限制的情况下实现不在字符串 q[0] 位置的字符的大写;我知道它需要一个循环,但我似乎总是超出限制。

#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!='[=10=]';++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!

您可以使用 isspace 函数 - 例如:

/* TO BE DONE START */
while (isspace(*q)) putchar(*q++);
for(*q = toupper(*q); *q; ) putchar(*q++);
putchar('\n');
/* TO BE DONE END */

这让我觉得很脏:

/* 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 是无符号的,或者如果有符号,则它所采用的字符串永远不会有负值。)

请注意 isspace()tolower() char 参数必须 转换为 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 */