【问题描述】输入两行字符串s和t(s和t最长含50个字符,可以含有空格),将s串中首次与t匹配的子串逆置,并将结果输出。 【输入文件】输入文件为invertsub.in,含有两行字符串s和t,分别以#作为串结束符。 【输出文件】输出文件invertsub.out只有一行,包含一个串,是要求的输出结果。在行末也要有一个回车符。 【输入样例】helloworld# llowor# 【输出样例】herowollld
时间: 2024-02-22 14:58:59 浏览: 49
将字符串中子串逆置
下面是一种实现思路:
1. 读取输入文件中的两行字符串 `s` 和 `t`;
2. 在字符串 `s` 中查找第一个与字符串 `t` 匹配的子串;
3. 如果匹配成功,则将该子串逆置;
4. 将结果输出到输出文件中。
下面是示例代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 51
void reverse(char *str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char tmp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = tmp;
}
}
int main() {
char s[MAX_LEN], t[MAX_LEN];
char result[MAX_LEN] = "";
FILE *fin, *fout;
fin = fopen("invertsub.in", "r");
fout = fopen("invertsub.out", "w");
fscanf(fin, "%[^#]#", s); // 读取s
fscanf(fin, "%[^#]#", t); // 读取t
char *pos = strstr(s, t); // 在s中查找t
if (pos != NULL) {
int len = strlen(t);
strncpy(result, s, pos - s); // 复制pos之前的部分到result
result[pos - s] = '\0';
strcat(result, t); // 将t接到result末尾
strcat(result, pos + len); // 将pos之后的部分接到result末尾
reverse(result + (pos - s)); // 将t逆置
} else {
strcpy(result, s); // 如果没有匹配的子串,直接将s复制到result
}
fprintf(fout, "%s\n", result); // 输出result到文件中
fclose(fin);
fclose(fout);
return 0;
}
```
注意,这里在读取字符串时使用了 `%[^#]`,表示读取除了 `#` 以外的所有字符。同时,在 `fscanf()` 中使用 `#` 作为结束符,可以避免读取到输入文件中的换行符。
阅读全文