c - 反转字符串中单词的顺序
问题描述
对于这样一个平庸的问题,我很抱歉,但我遇到了一个看似很小的问题,但根本无法克服它。对于我的任务,我必须从文件中取出一行字符串,然后将其向后放入另一个文件中,例如:
one two three
four five six
将会
three two one
six five four
我的问题是,我得到
three two one
si five four
所以基本上缺陷是每行开头都有一个空格字符,最后一个单词的最后一个字母总是丢失。这是我的反向功能:
void reverse(char input[], int length, char output[]) {
char space = 32;
input[length - 1] = space;
int value = 0;
int i, k = 0, j;
for (i = 0; i <= length; i++) {
if (input[i] == space) {
for (j = i - 1; j >= k; j--, value++) {
output[value] = input[j];
}
if (j == -1) {
output[value] = space;
value++;
}
k = i;
}
}
char c = 0;
for (int i = 0, j = length - 1; i <= j; i++, j--) {
c = output[i];
output[i] = output[j];
output[j] = c;
}
}
我正在做的是首先按字符反转每个单词,然后是整行。如果有人可以帮助我找到我错过的最后一点,我将不胜感激。
解决方案
缺陷来自您的方法:
- 为什么要在 offset 处强制一个空格
length - 1
?如果您阅读带有 的行fgets()
,则该行的末尾可能有一个换行符 ('\n'
),但在输入的末尾可能缺少它,这将解释x
最后一行被覆盖的原因。 - 您不应该修改输入缓冲区。
这是一个简化版本,以及一个简单的main
功能:
#include <stdio.h>
#include <string.h>
void reverse(const char *input, int length, char *output) {
int i, j, k, v;
for (i = k = v = 0;; i++) {
if (i == length || input[i] == ' ') {
for (j = i; j-- > k; v++) {
output[v] = input[j];
}
for (; i < length && input[i] == ' '; i++) {
output[v++] = ' ';
}
if (i == length) {
output[v] = '\0';
break;
}
k = i;
}
}
for (i = 0, j = length - 1; i < j; i++, j--) {
char c = output[i];
output[i] = output[j];
output[j] = c;
}
}
int main() {
char input[256];
char output[256];
while (fgets(input, sizeof input, stdin)) {
reverse(input, strcspn(input, "\n"), output);
puts(output);
}
return 0;
}
输出:
three two one
six five four
这是一个更简单的反向函数,一次运行:
#include <string.h>
void reverse(const char *input, int length, char *output) {
int i, j, k, v;
for (i = k = 0, v = length;; i++) {
if (i == length || input[i] == ' ') {
for (j = i; j-- > k;) {
output[--v] = input[j];
for (; i < length && input[i] == ' '; i++) {
output[--v] = ' ';
}
if (v == 0) {
output[length] = '\0';
break;
}
k = i;
}
}
}
推荐阅读
- javascript - 使用 JavaScript 提交表单时,如何从用户那里获取数量变量?
- linux - WSL crontab 找不到 nix-shell
- r - 使用留一法在 R 中进行线性回归预测
- vim - (gvim:11507): IBUS-WARNING **: 13:19:44.753: gvim 没有环绕文本功能的能力
- pytorch - 我正在尝试修改代码以使用多个 GPU 训练我的变压器图像标题模型以实现并行性。我不知道“列表”指的是什么
- swap - 谁能告诉我这段记忆的意义是什么?
- r - 在 R 中,如何使用 quote 或 bquote 引用评论?
- python-3.x - python中的退出函数
- android - Android:如何录制视频并将其实时发送到服务器
- list - Flutter - 明智地分组日期并显示在粘性标题下