如何将字符数组连接成单个字符串?
How to concatenate array of chars into single string?
我创建了一个输入用户名并输出其首字母的函数。比如"John Doe"应该是JD,"Rick Dixon Lightning"应该是RDL。它甚至应该处理混乱的条目,例如“geoRge 6w bu7sh”,返回 "GWB."
下面这段代码功能完美,但有一个问题:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
printf("Your name: ");
string name = GetString();
int nameLength = strlen(name);
int initials[nameLength];
int initialSwitch = 0;
for (int i = 0; i < nameLength; i++)
{
if(initialSwitch%2 == 0 && (int)name[i] != 32 && tolower(name[i]) >= 97 && tolower(name[i])<=122)
{
initials[initialSwitch] = (int)name[i];
initialSwitch++;
} else if(initialSwitch%2!=0 && (int)name[i] == 32){
initialSwitch++;
}
}
for (int i = 0; i<initialSwitch; i++)
{
printf("%c",toupper(initials[i]));
}
printf("\n");
}
底部输出循环单独输出每个首字母,而我需要将首字母输出为单个串联字符串。我已经搜索了互联网并提出了我最好的解决方案,不幸的是它无法正常运行:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
printf("Your name: ");
string name = GetString();
int nameLength = strlen(name);
char initials[nameLength];
int initialSwitch = 0;
for (int i = 0; i < nameLength; i++)
{
if(initialSwitch%2 == 0 && (int)name[i] != 32 && tolower(name[i]) >= 97 && tolower(name[i])<=122)
{
initials[initialSwitch] = (int)name[i];
initialSwitch++;
} else if(initialSwitch%2!=0 && (int)name[i] == 32){
initialSwitch++;
}
}
initials[initialSwitch]=(int)"[=11=]";
for (int i = 0; i<initialSwitch; i++)
{
printf("%s\n",initials);
}
}
对于测试输入 "John Bill Doe,",我尝试的解决方案输出 "j\nj\nj\nj\nj\n," 或五个 "j",每个都在自己的行上。
我哪里错了?
编辑:
感谢大家的帮助。总而言之,我犯了以下错误:
- 无关的 (int) 声明
- 循环打印字符串
- 必须创建额外的变量来存储首字母的数量
我已经添加了,因为我的初始开关在我的
首字母数组。这没有出现在我的顶级 "working" 示例中
因为它们是空白的,所以很难调试
意识到错误。
下面的工作代码:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
printf("Your name: ");
string name = GetString();
int nameLength = strlen(name);
char initials[nameLength];
int initialSwitch = 0;
int initialCount = 0;
for (int i = 0; i < nameLength; i++)
{
if(initialSwitch%2 == 0 && name[i] != 32 && tolower(name[i]) >= 97 && tolower(name[i])<=122)
{
initials[initialCount] = toupper(name[i]);
initialSwitch++;
initialCount++;
} else if(initialSwitch%2!=0 && name[i] == 32){
initialSwitch++;
}
}
initials[initialCount]='[=10=]';
printf("%s\n",initials);
}
我创建了一个输入用户名并输出其首字母的函数。比如"John Doe"应该是JD,"Rick Dixon Lightning"应该是RDL。它甚至应该处理混乱的条目,例如“geoRge 6w bu7sh”,返回 "GWB."
下面这段代码功能完美,但有一个问题:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
printf("Your name: ");
string name = GetString();
int nameLength = strlen(name);
int initials[nameLength];
int initialSwitch = 0;
for (int i = 0; i < nameLength; i++)
{
if(initialSwitch%2 == 0 && (int)name[i] != 32 && tolower(name[i]) >= 97 && tolower(name[i])<=122)
{
initials[initialSwitch] = (int)name[i];
initialSwitch++;
} else if(initialSwitch%2!=0 && (int)name[i] == 32){
initialSwitch++;
}
}
for (int i = 0; i<initialSwitch; i++)
{
printf("%c",toupper(initials[i]));
}
printf("\n");
}
底部输出循环单独输出每个首字母,而我需要将首字母输出为单个串联字符串。我已经搜索了互联网并提出了我最好的解决方案,不幸的是它无法正常运行:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
printf("Your name: ");
string name = GetString();
int nameLength = strlen(name);
char initials[nameLength];
int initialSwitch = 0;
for (int i = 0; i < nameLength; i++)
{
if(initialSwitch%2 == 0 && (int)name[i] != 32 && tolower(name[i]) >= 97 && tolower(name[i])<=122)
{
initials[initialSwitch] = (int)name[i];
initialSwitch++;
} else if(initialSwitch%2!=0 && (int)name[i] == 32){
initialSwitch++;
}
}
initials[initialSwitch]=(int)"[=11=]";
for (int i = 0; i<initialSwitch; i++)
{
printf("%s\n",initials);
}
}
对于测试输入 "John Bill Doe,",我尝试的解决方案输出 "j\nj\nj\nj\nj\n," 或五个 "j",每个都在自己的行上。
我哪里错了?
编辑:
感谢大家的帮助。总而言之,我犯了以下错误:
- 无关的 (int) 声明
- 循环打印字符串
- 必须创建额外的变量来存储首字母的数量 我已经添加了,因为我的初始开关在我的 首字母数组。这没有出现在我的顶级 "working" 示例中 因为它们是空白的,所以很难调试 意识到错误。
下面的工作代码:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
printf("Your name: ");
string name = GetString();
int nameLength = strlen(name);
char initials[nameLength];
int initialSwitch = 0;
int initialCount = 0;
for (int i = 0; i < nameLength; i++)
{
if(initialSwitch%2 == 0 && name[i] != 32 && tolower(name[i]) >= 97 && tolower(name[i])<=122)
{
initials[initialCount] = toupper(name[i]);
initialSwitch++;
initialCount++;
} else if(initialSwitch%2!=0 && name[i] == 32){
initialSwitch++;
}
}
initials[initialCount]='[=10=]';
printf("%s\n",initials);
}