如何创建一个改变字符串的函数?

时间:2014-03-06 18:54:54

标签: c string pointers

我创建了这个程序作为学校的家庭作业。该程序采用空格分隔的名字和姓氏,然后将首字母和名字的第一个字符大写,并将其余字母更改为小写。

我已成功完成此操作,但我想在函数中更改字母。我以前创建过很多函数但从不涉及字符串。正如我已经明白你必须为此目的使用指针,但我不明白以什么方式。

我的程序代码如下:

//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 = %s\n", name);

    return 0;

}

基本上我想在函数中包含整个for loop。我很感激有关这个问题的任何帮助。我也非常感谢任何可能为我提供有关该主题的更多知识的链接或网站。

提前致谢。

2 个答案:

答案 0 :(得分:3)

没有太多内容:

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,而name中的myfunc(name)将衰减为指向字符串第一个字符的指针。但由于字符串以空值终止,并且您使用strlen(),因此代码保持完全相同。

哦,还有一个快速说明:你应该把strlen(name)从循环中取出然后再进行。 strlen()来测试循环条件是不必要的,也是不合适的。

答案 1 :(得分:0)

在C和C ++中,数组变量(例如name)实际上是一个指针。数组是程序堆栈中的一个内存空间,它足够大,可以容纳一行中所需的元素数(例如MAX int s)。数组变量是一个指针,它引用数组第一个元素的内存地址,并使用[]运算符在引擎盖下执行指针运算以获得所需的元素。这就是为什么数组的第一个元素被索引为0:name[0]等同于*(name + 0)或仅*name

就像mah在他的评论中所说的那样,你可以创建一个函数来接收一个数组变量作为其参数,并将for循环作为其主体。

话虽这么说,当你将数组传递给函数时,几乎总是需要传递一个引用数组大小​​的第二个参数(或者至少是元素的数量)。指针仅指单个内存地址,只有通过谨慎使用它们才能用于表示数组。否则,您最终可能会超出数组的范围并导致程序崩溃(结果良好)或破坏其他内存(结果不佳)。

对于C风格的字符串,约定是将空字符作为最后一个字符,因此strlen()计算字符直到找到它为止。这可能是一个不传递数组大小的安全实例。