字符串s中只能存入字母和*,利用指针的方式将s中第一个字母前面的*全部移动到s的尾部。例如S中输入**abcd***ef,处理后输出S 为 abcd***ef**。下方给出主两数,大家需要写出fun 函数。要求用指针的形式,不用下标的形式。
时间: 2023-09-08 19:13:43 浏览: 88
```C++
void fun(char *s) {
char *p = s;
while (*p == '*') { // 找到第一个非 * 的字符
p++;
}
char *q = p;
while (*q != '\0') { // 找到最后一个字符
q++;
}
q--;
while (p <= q) { // 交换 * 和 非* 的位置
if (*p == '*') {
char temp = *p;
*p = *q;
*q = temp;
q--;
} else {
p++;
}
}
}
```
相关问题
字符串s中只能存入字母和*,利用指针的方式将s中的*全部移动到字母的尾部。例如5 中输入***abcd***ef,处理后输出S 为 abcdef******。下方给出主两数,大家需要写出 fun 西数。要求用指针的形式,不用下标的形式。
以下是一个可能的实现:
```c++
void moveStarsToEnd(char* s) {
char* p1 = s;
char* p2 = s;
while (*p2) { // 找到字符串s的末尾
p2++;
}
while (p1 < p2) {
if (*p1 == '*') { // 如果当前字符是'*'
char* tmp = p1;
while (tmp < p2) { // 找到下一个非'*'的字符
if (*tmp != '*') {
break;
}
tmp++;
}
if (tmp == p2) { // 如果后面全是'*',则已经完成移动
break;
}
*p1 = *tmp; // 将下一个非'*'的字符移到当前位置
*tmp = '*'; // 将当前位置置为'*'
}
p1++;
}
}
```
该函数使用两个指针 `p1` 和 `p2`,初始都指向字符串 `s` 的开头。`p2` 指向字符串的末尾,即最后一个字符的下一个位置。在第一个 while 循环中,找到字符串 `s` 的末尾位置。在第二个 while 循环中,不断移动 `p1`,如果当前字符是 `*`,则从 `p1` 开始向后找到下一个非 `*` 的字符,将其移到当前位置,同时将当前位置置为 `*`。这样,每次移动 `p1`,都会将一个 `*` 移动到字符串的末尾。最后,当 `p1` 到达 `p2` 时,所有的 `*` 都已经移动到了字符串的末尾。
#include<stdio.h> #include<stdlib.h> #include<string.h> struct student { int num; char name; char gender; int brt; int dst; int eng; int length; }studentlist; FILE *fp; void InsertList(struct studentlist *L) main() { struct student stu; /*定义学生变量stu*/ char tag; /*设置标志是否继续添加数据*/ int tolower(int tag); do { printf("学号:"); scanf("%d",&stu.num); printf("姓名:"); scanf("%s",stu.name); printf("性别:"); scanf("%s",stu.gender); printf("出生年月:"); scanf("%d",&stu.brt); printf("第二学期数据结构成绩:"); scanf("%s",stu.dst); printf("第二学期大英成绩:"); scanf("%s",stu.eng); printf("学生信息表长度:"); scanf("%s",stu.length); fseek(fp,0,SEEK_END); /*将指针移动到文件尾部*/ /*将学生信息存入文件中*/ fwrite(&stu,sizeof(struct student),1,fp); printf("继续添加吗(y/n):"); while (getchar()!='\n'); /*跳过当前行*/ tag=getchar(); tag=tolower(tag); /*将大写字母转化为小写字母*/ while(tag!='y'&&tag!='n') { printf("输入非法,重新输入(y/n):"); while(getchar()!='\n'); /*跳过当前行*/ tag=getchar(); tag=tolower(tag); /*将大写字母转化为小写字母*/ } }while(tag=='y'); /*当回答要求循环时*/ }
这段代码存在一些问题,首先是函数声明和主函数的定义不匹配,主函数应该是:
```
int main() {
...
return 0;
}
```
然后是结构体的定义和变量的声明应该分开,应该是:
```
struct student {
int num;
char name[20];
char gender;
int brt;
int dst;
int eng;
int length;
};
struct student studentlist;
int main() {
...
}
```
还有就是在使用 `scanf` 函数读取字符串时,应该使用 `%s` 格式化符,而不是 `%c`。
另外,代码中使用了文件操作函数,但是没有打开文件,应该在主函数开头加上:
```
fp = fopen("students.dat", "ab+");
if (fp == NULL) {
printf("文件打开失败!\n");
exit(1);
}
```
最后,在写入文件时应该检查是否写入成功,可以用 `fwrite` 函数的返回值进行检查:
```
if (fwrite(&stu, sizeof(struct student), 1, fp) != 1) {
printf("写入失败!\n");
exit(1);
}
```
综上所述,修改后的代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student {
int num;
char name[20];
char gender;
int brt;
int dst;
int eng;
int length;
};
struct student studentlist;
FILE *fp;
int main() {
fp = fopen("students.dat", "ab+");
if (fp == NULL) {
printf("文件打开失败!\n");
exit(1);
}
struct student stu;
char tag;
do {
printf("学号:");
scanf("%d", &stu.num);
printf("姓名:");
scanf("%s", stu.name);
printf("性别:");
scanf("%s", &stu.gender);
printf("出生年月:");
scanf("%d", &stu.brt);
printf("第二学期数据结构成绩:");
scanf("%d", &stu.dst);
printf("第二学期大英成绩:");
scanf("%d", &stu.eng);
printf("学生信息表长度:");
scanf("%d", &stu.length);
fseek(fp, 0, SEEK_END);
if (fwrite(&stu, sizeof(struct student), 1, fp) != 1) {
printf("写入失败!\n");
exit(1);
}
printf("继续添加吗(y/n):");
while (getchar() != '\n');
tag = getchar();
tag = tolower(tag);
while (tag != 'y' && tag != 'n') {
printf("输入非法,重新输入(y/n):");
while (getchar() != '\n');
tag = getchar();
tag = tolower(tag);
}
} while (tag == 'y');
fclose(fp);
return 0;
}
```
阅读全文