gpt4 book ai didi

c - 我如何处理 CS50 首字母中单词之前或之间的多个空格(更舒适)?

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:53 24 4
gpt4 key购买 nike

问题:http://docs.cs50.net/problems/initials/more/initials.html正如我在标题中所说,如果用户在姓名前输入额外的空格或在名字和姓氏之间输入额外的空格,我似乎无法让程序输出没有空格的首字母。

现在,只有当我输入我的名字时它才有效:First Last 名字前没有空格,两个词之间只有一个空格。它将打印出 FL 而没有任何额外的空格。无论名字和姓氏之前或之间有多少额外空格,我都希望它执行此操作。

我当前的代码:

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

int main(void) {
printf("Name: ");
string s = get_string();

printf("%c", toupper(s[0]));

for (int i = 0; i < strlen(s); i++) {
if (s[i] == ' ') {
printf("%c", toupper(s[i +1]));
}
}

printf("\n");
}

最佳答案

虽然您已经有了一个很好的答案,但假设 cs50.h 世界中的 string s = get_string(); 只是填充 s对于一个 nul-terminated 字符串,并且 s 是一个字符数组指向已分配内存的指针 有一个您可以考虑改进的几个方面。

首先,不要使用printf 来打印单个字符。这就是 putchar(或 fputc)的用途。 (假设一个智能优化编译器应该为你做这件事,但不要依赖编译器为你修复低效率问题)例如,而不是

printf("%c", toupper(s[0]));

简单

putchar (toupper(s[0]));

此外,您可能还需要考虑一些逻辑问题。你想知道的是 (1)“当前字符是字母吗?”(例如 isalpha (s[x]),(2)“是这是第一个字符(例如索引 0),还是空格后面的字符?”(例如 s[x-1] == ' '). 有了 than 信息,您可以使用单个 putchar 来输出首字母。

此外,由于 s 是一个字符串,您可以简单地使用 指针算法(例如 while (*s) {.. do stuff with *s 。 .; s++;}) 当你到达 nul-terminator 时结束,或者如果你想保留 s 作为指向第一个字符的指针,或者如果它是一个数组,则char *p = s;并对p进行操作

将这些部分放在一起,您可以在不依赖 string.h 的情况下执行类似以下操作(您可以使用简单的 if 和第 6 位的位操作来也移除对 ctype.h 函数的依赖——那是为了以后):

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

int main (void) {

char *p = NULL;

printf ("Name: ");
string s = get_string(); /* assuming this works as it appears */

for (p = s; *p; p++)
/* if current is [a-zA-Z] and (first or follows space) */
if (isalpha (*p) && (p == s || (*(p - 1) == ' ')))
putchar (toupper (*p));

putchar ('\n'); /* tidy up */

return 0;
}

示例使用/输出

$ ./bin/initials
Name: David C. Rankin
DCR

$ ./bin/initials
Name: Jane Doe
JD

$ ./bin/initials
Name: d
D

$ ./bin/initials
Name: George W... Bush
GWB

关于c - 我如何处理 CS50 首字母中单词之前或之间的多个空格(更舒适)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44857324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com