请求解析反转句子的C语言代码中指针q与r的作用
句子单词反转代码解析及指针q、r含义说明
这段C代码的功能是反转输入句子的单词顺序(比如输入"Hello world!",输出"world! Hello"),同时保留原句中的空格布局。下面重点拆解核心逻辑,以及指针q和r的具体作用:
前置准备
- 代码先分配内存存储输入句子,读取用户输入后,创建数组
arr存储反转结果,p是arr的写入指针,始终指向当前待写入的位置。 - 注意:代码里
calloc(120, sizeof(char*))存在错误,应该用sizeof(char);gets函数已被C标准废弃,存在缓冲区溢出风险,建议替换为fgets。
核心循环与指针含义
指针q的作用
char *q = sent + n; 初始化时,q指向输入字符串sent的末尾终止符'\0'的地址。
在整个循环过程中,q的核心角色是标记当前处理单元(单词或连续空格)的右边界,每次循环后会向左移动,逐步从字符串末尾往开头遍历。
指针r的作用
r是每次处理单词时临时定义的指针,它的作用是标记当前处理单词的左边界:通过向左移动,找到单词的起始位置(即单词前的第一个空格或字符串开头)。
完整循环流程拆解
处理末尾连续空格
while (q != sent && isblank(*(q-1))) *p++ = *--q;从
q的前一个位置(字符串最后一个有效字符)开始检查,如果是空格,就将该空格复制到结果数组arr,同时q左移一位、p右移一位,直到遇到非空格字符或字符串开头。这一步是为了把原句末尾的空格保留到反转后的句子开头。定位单词的左右边界
- 先把当前
q的值赋给r,此时q指向当前待处理单词的右边界的下一个位置。 - 然后通过内层循环移动
r:
从while (r != sent && !isblank(*(r-1))) --r;r的前一个位置开始检查,只要不是空格就左移r,直到遇到空格或字符串开头——此时r就指向了当前单词的起始位置。
- 先把当前
复制单词到结果数组
memcpy(p, r, q-r); p+= q - r; q = r;- 用
memcpy把r到q之间的字符(也就是完整的当前单词)复制到arr的当前写入位置p。 - 移动
p到下一个待写入的位置,把q更新为r的位置,准备处理下一个单元(空格或单词)。
- 用
重复上述步骤,直到
q移动到字符串开头,整个反转过程完成。
内容的提问来源于stack exchange,提问作者wolf08
相关产品推荐
相关产品推荐

