我创建了这个程序作为学校的作业。该程序的名字和姓氏被空间分离,然后先于大写第一个和姓氏的第一个字符,然后将其余的字母更改为较低的情况。
我已经成功地做到了,但是我想在函数内进行字母的更改。我以前创建了很多功能,但从未与涉及的字符串相关。据我了解,您必须将指针用于此目的,但我不明白哪种方式。
我的程序代码如下:
//The program only accepts first and last name seperated by 1 space.
#define MAX 31
int main()
{
char name[MAX];
int i;
printf("What is your name? (First name and last name only): ");
fgets(name, sizeof(name), stdin);
name[strlen(name)-1] = 0;
for (i=0; i<strlen(name); i++)
{
if (i==0)
name[i]=toupper(name[i]);
else if(name[i] == ' ') {
name[i+1]=toupper(name[i+1]);
i++;
}
else
name[i]=tolower(name[i]);
}
printf("Name = %sn", name);
return 0;
}
基本上,我想将整个for loop
放在功能中。感谢有关该主题的任何帮助。我也非常感谢任何可能为我提供更多知识的链接或网站。
预先感谢。
没有太多:
void myfunc(char name[]) {
int i;
for (i=0; i<strlen(name); i++)
{
if (i==0)
name[i]=toupper(name[i]);
else if(name[i] == ' ') {
name[i+1]=toupper(name[i+1]);
i++;
}
else
name[i]=tolower(name[i]);
}
}
和main()
:
myfunc(name);
在这种情况下,您甚至不必考虑指针。实际上,函数声明中的char name[]
将被视为char *name
,myfunc(name)
中的name
将腐烂成指向字符串的第一个字符的指针。但是,由于字符串是无效的,并且您使用strlen()
,因此代码保持完全相同。
哦,快速注意:您应该将strlen(name)
从循环中取出,然后再做。在每次迭代中调用strlen()
以测试循环条件是不必要的且无缺的。
在C和C 中,数组变量(例如name
)实际上是指指针。阵列是程序堆栈中的一个内存空间,足够大,可以连续符合所需数量的元素(例如MAX int
s)。数组变量是指数组第一个元素的内存地址,并使用[]
操作员在引擎盖下执行指针算术以获取所需元素。这就是为什么数组的第一个元素被索引为0:name[0]
等于*(name + 0)
或*name
。
就像Mah在评论中所说的那样,您可以创建一个接收数组变量作为其参数的函数,该函数将您的for
循环作为其身体。
话虽如此,当您将数组传递给函数时,几乎总是有必要通过第二个参数来指代数组的大小(或至少元素的数量)。指针仅参考一个单个内存地址,只有通过仔细使用才能用来表示数组。否则,您最终可能会超出数组的界限并崩溃程序(好结果)或破坏其他内存(不良结果)。
使用C风格的字符串,该约定是将空字符作为最后一个字符,因此strlen()
计数字符直到找到它为止。这可能是一个安全的实例,不通过数组的大小。