c - 在不创建副本的情况下就地修改字符串
问题描述
我正在努力完成一项任务。术语“就地修改而不创建副本”和“返回值与传递给函数的值相同”是什么意思?
如何检查我的代码是否满足这两个条件?
// 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);
.
.
}
解决方案
在此上下文中“就地修改”意味着函数更改其参数引用的数据。如果您以 a 的形式传递字符串char *
,则调用者的字符串副本将被修改。处理字符串的另一种方法是返回字符串的修改副本,同时保持原始字符串不变。如果函数没有改变原始函数,并且它是这样设计的,那么将参数定义为const
. 这既更具表现力,因为很明显数据没有被修改,并且它允许编译器发现实际上可能修改数据的粗心错误。
如果一个函数“返回相同的值”,它就意味着——返回正是参数。原则上,函数没有理由返回特定参数的值,因为调用者总是知道该值是什么——否则它一开始就无法将其提供给函数。然而,许多长期存在的函数(例如strcpy
)实际上确实返回了它们的参数之一。
推荐阅读
- ios - 在新的远程通知中启动文本到语音
- r - 从 ggplot 中保存具有自定义尺寸的图
- testing - testcafe 支持 Web Workers 吗?
- amazon-web-services - 来自多个队列的 SQS 消息的 Lambda 批处理
- php - java spring boot是否提供像php CodeIgniter查询构建器这样的查询构建器
- php - Stripe 使用 SCA 身份验证创建订阅
- javascript - 如何在 React Modal 上显示组件
- mainframe - 无法获取已排序的记录。获取空文件
- laravel - laravel 分页 - 哪个值具有第二个参数
- c++ - 将单个可执行项目变成多可执行项目