首页 > 解决方案 > 在不创建副本的情况下就地修改字符串

问题描述

我正在努力完成一项任务。术语“就地修改而不创建副本”和“返回值与传递给函数的值相同”是什么意思?

如何检查我的代码是否满足这两个条件?

// converts all lowercase into uppercase

char* mystrupr(char *string)
{
    int myStrlen = strlen(string);
    for (int i = 0; i < myStrlen; i++)
        if (string[i] >= 'a' && string[i] <= 'z')
            *(string + i) -= 32;

    return string;
}

我假设我违反了条件,因为当我在程序的另一部分使用此函数时,它给了我错误:

passing argument 1 of 'mystrupr' discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
note: expected 'char *' but argument is of type 'const char *'

所述使用大写函数的代码片段:

int spellcheck(char const *word) {
.
.
mystrupr(word);
.
.
}

*编辑(制作副本)

int spellcheck(char const *word) {
.
.
char *myWord = word
mystrupr(myWord);
.
.
}

标签: c

解决方案


在此上下文中“就地修改”意味着函数更改其参数引用的数据。如果您以 a 的形式传递字符串char *,则调用者的字符串副本将被修改。处理字符串的另一种方法是返回字符串的修改副本,同时保持原始字符串不变。如果函数没有改变原始函数,并且它是这样设计的,那么将参数定义为const. 这既更具表现力,因为很明显数据没有被修改,并且它允许编译器发现实际上可能修改数据的粗心错误。

如果一个函数“返回相同的值”,它就意味着——返回正是参数。原则上,函数没有理由返回特定参数的值,因为调用者总是知道该值是什么——否则它一开始就无法将其提供给函数。然而,许多长期存在的函数(例如strcpy)实际上确实返回了它们的参数之一。


推荐阅读