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 */
我需要制作一个 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 */