c - 无法将字符从一个字符串分配给另一个
问题描述
所以我有一个函数,它接受一个字符串,去掉特殊格式的字符,并将它分配给另一个字符串以供以后处理。
一个示例调用将是:
act_new("$t does $d");
它应该去掉 $t 和 $d 并将第二个字符串保留为“does”,但它没有分配任何东西。经过几年的闲置后,我重新开始编程,这是别人的代码(A MUD 代码库,Rom),但我觉得我缺少指针分配的基本内容。有小费吗?
(这是截断的代码,其余的直到很久以后才对 str 或 point 进行任何操作)
void act_new(const char *format)
{
const char *str;
char *point;
str = format;
while ( *str != '\0' ) {
if ( *str != '$' ) {
*point++ = *str++;
continue;
}
}
}
解决方案
正如评论中所指出的,您的代码存在一些问题:
point
未初始化(垃圾指针值)continue
什么都不做$
如果遇到a 则无限循环
在编写函数时,还必须记住,如果$
遇到 a 当且仅当它不是字符串中的最后一个字符(除了'\0'
),则跳过一个额外的字符。
由于您知道需要循环多少次,因此for
循环更适合,并且作为奖励,您不必明确检查 a 之后的字符$
是否是'\0'
在跳过额外字符时format
(src
下面重命名)。另外,不要忘记终止目标字符串。
此代码将为您处理这些事情:
void act_new(const char *src)
{
const size_t length = strlen(src);
char * const dst = (char*)malloc(sizeof(char)*(length+1));
if(dst == NULL)
// Error handling left out
return;
char *point = dst;
for(size_t i = 0; i < length; ++i)
{
if(src[i] == '$')
{
++i;
continue;
}
*point++ = src[i];
}
*point = '\0'; //Terminate string properly
printf("%s\n", dst);
free(dst);
}
推荐阅读
- python - 如何从 tensorflow-datasets 下载特定的标签/图像
- c# - Threading.Volatile.Read(Int64) 和 Threading.Interlocked.Read(Int64) 的区别?
- node.js - 如何使用 NodeJs 模块编写 JSON 文件以读取 Azure 订阅上 CosmoDB 上的数据
- android - 如何使用 rajawali 在多个 3D 对象之间进行着色?
- java - 如何在 ObjectMapper 中忽略空对象“{}”而不是空字符串?
- google-cloud-platform - 尝试在 BigQuery 和 Cloudsql 之间建立连接时出现“内部错误”
- java - 我正在尝试根据按钮点击刷新内容
- matplotlib - 将图例与轴对齐
- android - 如何在没有错误的情况下在android中实现实现?
- azure - 将卷挂载到 Azure 文件时容器启动失败