一个相当糟糕的函数

今天在坛里面见到一个函数,看了心寒。

代码是这样的,

 

#include <stdio.h>
#include <stdlib.h>

void fun(float *p1,float *p2,float *s)
{
s=(float*)calloc(1,sizeof(float)) ;
*s=*p1+*p2++;
}

fun函数有如下问题:

1、要求float*型参数p1,p2和s。而计算过程根本用不上,实际上只需使用float类型的p1和p2就足够了的,更不要说p2++了。

2、要求的参数s所指的空间没有使用,而calloc申请了另一块空间,计算的结果也没有传回到原来的空间,这样参数s就变成纯粹的一种摆设,而更严重的是这样子很容易让人产生误会,比如LZ。

3、使用calloc()分配了一块个数为1的空间,须知calloc()是用来产生数组并且初始化的函数,相比malloc()效率低的多,从后面也看不出有进行初始化的必要。有简单直接的malloc()不用,简直浪费!

4、使用calloc()申请分配的空间在使用完没有释放,在出了fun()函数之后便再也无法联系得到了,成了孤魂野鬼。

不知道这个函数是什么?老手写来骗人的?还是新手写来练手的?是新手也绝对不要这样写程序。我想这是个十足的糟糕函数!

 

<think>我们参考用户的问题:如何在代码中实现退格并插入一个符号的功能 用户想要的是在字符串处理中模拟退格键的效果(删除前一个字符),然后插入一个新的符号。 根据引用[1]和引用[3]的描述,退格操作实际上是删除前一个字符。在编程中,我们可以通过删除字符串的最后一个字符来模拟退格,然后再添加新的符号。 我们可以考虑以下几种情况: 1. 如果当前字符串不为空,我们需要删除最后一个字符,然后添加新的符号。 2. 如果当前字符串为空,则退格操作无效(因为无字符可删),此时直接添加新符号可能不合适,所以通常只添加新符号而不做退格(或者忽略退格操作)。 但是,用户要求的是“退格并插入一个符号”,所以即使字符串为空,我们也可以先尝试退格(虽然无效果)再插入符号。这样,如果字符串为空,退格操作无效,然后插入符号,结果就是新符号。 因此,我们可以这样实现: result = (原始字符串) 步骤1:如果字符串长度大于0,则删除最后一个字符(模拟退格) 步骤2:在字符串末尾添加新的符号 但是,注意引用[1]中提到:“按一次退格键几乎不明显,更糟糕的是,我将必须复制所有字符直到插入符号的位置-1并将它们附加到插入符号位置之后的所有字符”。这里提到的是更复杂的场景:在字符串中间插入。但用户的问题没有明确是在末尾还是中间,所以我们先考虑在末尾的情况。如果是在中间,我们需要知道当前光标的位置。 用户的问题没有提到光标位置,所以我们假设用户是在字符串的末尾进行操作(这是最常见的情况)。如果用户需要在字符串中间操作,则需要知道光标位置,然后删除光标前的一个字符,再在光标位置插入新符号。 因此,我们分两种情况: 情况1:在字符串末尾操作(简单) 情况2:在字符串中间操作(需要光标位置) 由于用户没有明确,我们可以先实现末尾操作,然后扩展中间操作。 根据引用[3]中vim的操作,我们可以知道在文本编辑中,退格是删除光标前的一个字符。因此,我们需要维护一个光标位置。 但是,用户的问题比较抽象,我们可以提供两种方案: 方案A:假设总是在末尾操作(不需要光标位置) 方案B:支持任意位置操作(需要光标位置) 我们根据用户问题中的引用[1]和引用[3]可以推断,用户可能是在一个文本编辑器环境中,因此我们考虑更通用的方案(带光标位置)。 实现思路: 我们用一个字符串和一个整数(表示光标位置)来表示当前文本状态。 操作: 1. 退格:如果光标位置大于0,则删除光标前的一个字符,光标位置前移一位。 2. 插入符号:在光标位置插入一个字符,然后光标位置后移一位。 那么,退格并插入一个符号,可以分解为: 先执行退格操作(如果可能),然后在当前光标位置插入新符号。 注意:退格操作后光标位置已经前移了一位,然后插入符号时,我们在新的光标位置插入,插入后光标位置再后移一位。 例如,初始字符串为"abc",光标在位置3(末尾): 退格:删除'c',字符串变为"ab",光标移动到位置2。 插入符号'x':在位置2插入,得到"abx",光标移动到位置3。 所以,最终结果是"abx"。 如果初始字符串为空,光标位置0: 退格:无法删除,光标位置不变(0) 插入'x':在位置0插入,得到"x",光标移动到1。 因此,我们可以编写一个函数,输入当前字符串、光标位置、要插入的符号,输出新的字符串和新的光标位置。 步骤: 1. 如果光标位置大于0,则删除光标前的一个字符(即位置cursor-1处的字符),并将光标前移一位(cursor-1)。否则,不做删除操作,光标不变。 2. 在光标当前位置插入新符号,然后光标后移一位(cursor+1)。 但是,注意:删除操作后,字符串长度减少1,光标位置也减1。然后插入新字符,从当前光标位置插入,插入后光标位置加1。 代码示例(使用Python): def backspace_and_insert(s, cursor, char): # 处理退格 if cursor > 0: # 删除光标前的一个字符 s = s[:cursor-1] + s[cursor:] cursor -= 1 # 在光标处插入新字符 s = s[:cursor] + char + s[cursor:] cursor += 1 return s, cursor 测试: 初始:s="abc", cursor=3, char='x' 退格:cursor>0 -> 删除位置2的字符('c')-> s="ab", cursor=2 插入:在位置2插入'x' -> s="abx", cursor=3 初始:s="", cursor=0, char='x' 退格:cursor=0,不删除 插入:在0插入'x' -> s="x", cursor=1 但是,如果我们在中间操作,例如:s="abc", cursor=1(在a和b之间,即a之后,b之前) 退格:删除位置0(a)-> s = "bc", cursor=0 插入:在0插入'x' -> s="xbc", cursor=1 这样,我们实现了在任意位置退格并插入。 然而,用户可能不需要维护光标位置,而是只在末尾操作。那么我们可以简化: def backspace_and_insert_end(s, char): if len(s) > 0: s = s[:-1] # 删除最后一个字符 s += char return s 测试:s="abc" -> 删除'c' -> 变成"ab" -> 加上'x' -> "abx" 根据用户的问题描述,他提到“在编程中实现退格并输入一个符号”,我们可以提供两种方案,并说明适用场景。 另外,引用[2]中提到了在字符串中使用转义字符,例如用'\b'表示退格符。但是,注意:在字符串中,退格符'\b'只是一个控制字符,当打印到控制台时,它会将光标后退一格,但并不会删除字符。后续打印的字符会覆盖前面的字符。但是,如果我们在字符串中直接包含'\b',然后打印,可能会看到退格效果(取决于终端)。例如: s = "abc\bd" # 打印出来是 abd(因为c被d覆盖) 但是,这只是在输出显示上的效果,字符串本身还是"abc\bd"。如果用户需要的是在字符串内容中实际删除前一个字符,那么不应该使用'\b',而是像上面那样操作字符串。 因此,我们需要明确用户的需求: - 如果用户需要的是在控制台输出时模拟退格并替换的效果,可以使用退格符'\b'(然后紧接着打印新字符)。但注意,这不会改变字符串本身,只是显示效果。 - 如果用户需要修改字符串内容(即真正删除前一个字符并插入新字符),那么应该使用字符串操作(如上述方案)。 根据引用[1]中用户的描述:“按一次退格键几乎不明显”,以及“必须复制所有字符直到插入符号的位置-1”,这明显是在操作字符串内容,而不是仅仅输出效果。所以我们采用字符串操作的方法。 因此,我们提供两种方案: 方案1:在字符串末尾操作(简单) 方案2:在任意光标位置操作(需要维护光标位置) 下面用代码示例说明: 方案1(末尾操作): def backspace_and_insert_tail(s, char): # 如果字符串非空,删除最后一个字符 if s: s = s[:-1] return s + char 方案2(任意位置操作): def backspace_and_insert(s, cursor, char): if cursor > 0: # 删除光标前的一个字符 s = s[:cursor-1] + s[cursor:] cursor -= 1 # 在光标处插入新字符 s = s[:cursor] + char + s[cursor:] cursor += 1 return s, cursor 注意:方案2返回修改后的字符串和新的光标位置。 用户可以根据自己的需求选择。 另外,引用[4]中提到了数据库插入操作,但似乎与退格无关,所以这里不参考。 总结:根据用户需求,我们提供了两种实现方式,并解释了区别。 最后,生成相关问题: 1. 如何在控制台输出时模拟退格效果? 2. 在字符串中间插入字符有哪些方法? 3. 如何实现一个支持退格和插入的简单文本编辑器?</think>在编程中实现"退格并插入符号"的功能,核心思路是**删除光标前的一个字符(模拟退格),再在当前位置插入新符号**。以下是具体实现方法,分两种情况: --- ### 一、在字符串末尾操作(无需维护光标位置) 适用于直接在字符串末尾追加内容时模拟退格+插入: ```python def backspace_insert(s: str, char: str) -> str: """删除末尾字符并插入新符号""" if s: # 字符串非空时删除末尾字符 s = s[:-1] return s + char # 插入新符号 # 示例 original = "Hello" result = backspace_insert(original, "X") # 输出 "HellX" ``` --- ### 二、在任意光标位置操作(需维护光标位置) 适用于文本编辑器等需要指定光标位置的场景: ```python def backspace_insert_at_cursor(s: str, cursor: int, char: str) -> tuple[str, int]: """在指定光标位置退格并插入新符号 返回: (新字符串, 新光标位置)""" if cursor > 0: # 删除光标前字符(退格) s = s[:cursor-1] + s[cursor:] cursor -= 1 # 光标前移 # 插入新符号 s = s[:cursor] + char + s[cursor:] cursor += 1 # 光标后移 return s, cursor # 示例 text = "Hello|World" # | 表示光标位置(索引5) new_text, new_cursor = backspace_insert_at_cursor(text, 5, "X") # 结果: ("HellX|World", 光标位置5) ``` --- ### 关键说明 1. **退格操作本质** 删除光标前字符(`s[:cursor-1] + s[cursor:]`),相当于删除索引`cursor-1`处的字符[^3]。 2. **光标位置维护** - 退格后光标前移(`cursor -= 1`) - 插入后光标后移(`cursor += 1`)[^1] 3. **边界处理** - 当光标在起始位置(`cursor=0`)时,退格操作无效 - 空字符串直接插入新符号 --- ### 应用场景 - 文本编辑器(如Vim的`x`命令删除字符后插入[^3]) - 命令行输入校验(如密码输入时替换字符) - 动态字符串处理(如自动更正功能) > 提示:在终端显示中,可用`\b`退格符临时覆盖字符(如`print("abc\bd")`显示`abd`)[^2],但这仅改变显示效果,不修改字符串内容。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值