输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算: 输入一个字符串 t 和一个正整数 m,将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,再输出字符串 s。 要求定义并调用函数 strmcpy(s,t,m), 它的功能是将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,函数形参s和t的类型是字符指针,形参m的类型是int,函数类型是void。 输入输出示例:括号内为说明,无需输入输出 输入样例: 3 (repeat=3) happy new year 7 happy 1 new 4 输出样例: new year (从"happy new year"第7个字符开始组成的新字符串为"new year") happy (从"happy"第1个字符开始组成的新字符串为"happy") error input ("new"的长度小于4)
时间: 2024-03-23 08:43:51 浏览: 58
下面是一个实现题目要求的程序:
```c++
#include <iostream>
#include <cstring>
using namespace std;
void strmcpy(char* s, char* t, int m);
int main() {
int repeat;
cin >> repeat;
cin.get();
for (int i = 0; i < repeat; i++) {
char t[100], s[100];
int m;
cin.getline(t, 100);
cin >> m;
s[0] = '\0'; // 初始化字符串 s
strmcpy(s, t, m);
cout << s << endl;
}
return 0;
}
void strmcpy(char* s, char* t, int m) {
int len = strlen(t);
if (m > len || m < 1) {
cout << "error input" << endl;
} else {
for (int i = m - 1; i < len; i++) {
s[i - m + 1] = t[i];
}
s[len - m + 1] = '\0'; // 在字符串末尾添加结束符
}
}
```
在这个程序中,我们首先定义了函数 `strmcpy`,该函数接受三个参数:指向字符串 `s` 和 `t` 的指针,以及整数 `m`。在函数中,我们首先计算字符串 `t` 的长度 `len`,然后根据 `m` 的值判断是否存在输入错误。如果输入错误,我们输出错误信息;否则,我们使用一个循环将字符串 `t` 中从第 `m` 个字符开始的字符复制到字符串 `s` 中。在复制完成后,我们在字符串 `s` 的末尾添加一个结束符,以确保它是一个合法的字符串。
在 `main` 函数中,我们首先读入一个整数 `repeat`,然后使用一个循环进行 `repeat` 次操作。在每次操作中,我们首先读入一个字符串 `t` 和一个整数 `m`,然后初始化字符串 `s`,调用函数 `strmcpy` 将字符串 `t` 中从第 `m` 个字符开始的字符复制到字符串 `s` 中,最后输出字符串 `s`。
需要注意的是,在使用 `getline` 函数读入字符串 `t` 后,我们需要使用 `cin` 读入一个整数 `m`。由于之前使用 `getline` 函数读入了一个字符串,因此需要使用 `cin.get()` 读取输入流中的换行符,以便后续读取整数 `m`。
另外,题目中要求使用函数 `strmcpy` 复制字符串,因此我们在函数中使用循环进行复制操作。然而,在实际开发中,为了提高代码的可读性和可维护性,更推荐使用现有的字符串复制函数,如 `strcpy`、`strncpy` 等。如果使用 `strcpy` 函数进行字符串复制,需要注意先为指针 `s` 指向的内存空间分配足够的空间,否则会导致内存访问错误。
阅读全文