void delchar( char *str, char c ){ char *p=str; while(*p){ if(*p==c){ char *tp=p; while(*tp){ *tp=*(tp+1); tp++; } }else p++; //特别注意,上面while循环中第一轮的*tp+*(tp+1)会将原来的*p的值替换为下一个字符,所以不需要p++ } }
时间: 2023-07-15 08:14:08 浏览: 71
这是一个删除字符串中指定字符的函数。函数接收两个参数,第一个参数是待删除字符的字符串,第二个参数是要删除的字符。函数内部使用了两个指针变量,p 指向字符串的首地址,tp 用于遍历字符串中的每个字符。
函数工作原理是:遍历字符串中的每个字符,如果当前字符等于要删除的字符 c,就将 tp 指向该字符,然后将 tp 后面的所有字符依次向前移一位,最后将字符串结尾符 '\0' 的位置向前移一位。如果当前字符不等于要删除的字符 c,就继续遍历下一个字符。
需要注意的是,由于在内部 while 循环中第一轮的 *tp+*(tp+1) 会将原来的 *p 的值替换为下一个字符,所以此时不需要执行 p++ 操作,否则会跳过下一个字符。
另外,这段代码存在一个潜在的问题,如果字符串中连续有多个要删除的字符,内部 while 循环可能会移动到字符串结尾符之后的内存区域,导致程序崩溃。可以通过在内部 while 循环中添加对字符串结尾符的判断来避免这个问题。
相关问题
检查这段代码的错误#include <stdio.h>#include <string.h>#define MAX_LEN 1000void encrypt(char *str, int len) { for (int i = 0; i < len; i++) { str[i] ^= 0x7F; }}void decrypt(char *str, int len) { for (int i = 0; i < len; i++) { str[i] ^= 0x7F; }}int main() { char str[MAX_LEN]; char path[MAX_LEN]; int len = 0; printf("请输入字符串,以#作为结束条件:\n"); while (1) { char c = getchar(); if (c == '#') { break; } str[len++] = c; } str[len] = '\0'; printf("请输入保存路径:\n"); scanf("%s", path); FILE *fp = fopen(path, "wb"); if (fp == NULL) { printf("打开文件失败!\n"); return -1; } encrypt(str, len); fwrite(str, sizeof(char), len, fp); fclose(fp); fp = fopen(path, "rb"); if (fp == NULL) { printf("打开文件失败!\n"); return -1; } fseek(fp, 0, SEEK_END); len = ftell(fp); fseek(fp, 0, SEEK_SET); char *buf = (char *)malloc(len * sizeof(char)); fread(buf, sizeof(char), len, fp); fclose(fp); decrypt(buf, len); printf("解密后的字符串为:%s\n", buf); free(buf); return 0;}
这段代码的逻辑看起来没什么问题,但是有一些潜在的问题:
1. 在使用`malloc`分配内存之后,需要使用`free`释放内存,否则会造成内存泄漏。
2. 在使用`fread`读取文件数据时,需要考虑到读取的数据可能不是以`\0`结尾的字符串,因此需要自己手动在读取数据后添加`\0`。
以下是修改后的代码:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_LEN 1000
void encrypt(char *str, int len) {
for (int i = 0; i < len; i++) {
str[i] ^= 0x7F;
}
}
void decrypt(char *str, int len) {
for (int i = 0; i < len; i++) {
str[i] ^= 0x7F;
}
}
int main() {
char str[MAX_LEN];
char path[MAX_LEN];
int len = 0;
printf("请输入字符串,以#作为结束条件:\n");
while (1) {
char c = getchar();
if (c == '#') {
break;
}
str[len++] = c;
}
str[len] = '\0';
printf("请输入保存路径:\n");
scanf("%s", path);
FILE *fp = fopen(path, "wb");
if (fp == NULL) {
printf("打开文件失败!\n");
return -1;
}
encrypt(str, len);
fwrite(str, sizeof(char), len, fp);
fclose(fp);
fp = fopen(path, "rb");
if (fp == NULL) {
printf("打开文件失败!\n");
return -1;
}
fseek(fp, 0, SEEK_END);
len = ftell(fp);
fseek(fp, 0, SEEK_SET);
char *buf = (char *)malloc(len + 1); // 加1用于存放字符串结尾符'\0'
fread(buf, sizeof(char), len, fp);
buf[len] = '\0'; // 手动添加字符串结尾符'\0'
fclose(fp);
decrypt(buf, len);
printf("解密后的字符串为:%s\n", buf);
free(buf); // 释放内存
return 0;
}
```
#include <stdio.h> #include <string.h> /* 返回第1个重复出现两次的字符 */ char findFirstRepeat(char* pStr); int main(void) { char str[501], c; int i = 0; while ((c = getchar()) != '\n') str[i++] = c; str[i] = '\0'; c = findFirstRepeat(str); putchar(c); return 0; } //**************begin******************** char findFirstRepeat(char* pStr){ } //*************end*************************补全代码
补全代码如下:
```c
char findFirstRepeat(char* pStr){
int len = strlen(pStr);
int freq[256] = {0}; // 记录每个字符出现的次数
for (int i = 0; i < len; i++) {
freq[pStr[i]]++;
if (freq[pStr[i]] == 2) { // 出现了两次,找到第一个重复出现的字符
return pStr[i];
}
}
return '\0'; // 没有重复出现的字符
}
```
该函数使用一个长度为 256 的数组 `freq` 记录每个字符出现的次数,当一个字符第二次出现时,就找到第一个重复出现的字符,返回它。若遍历完整个字符串都没有重复出现的字符,则返回空字符 `'\0'`。