免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: attempt
打印 上一主题 下一主题

关于 C 语言中字符串替换的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-05-06 18:14 |只看该作者

  1. /*
  2.     将一文件中的某个ip替换掉    by wzt
  3. */

  4. #include <stdio.h>
  5. #include <string.h>

  6. #define MAXLINE         1024
  7. #define MAXIP           20
  8. #define DEFAULT_FILE    "d:\\c\\6.txt"

  9. char old_ip[MAXIP];
  10. char new_ip[MAXIP];

  11. /* 将字符串"MYSERVER_IP  =  "保存到临时变量temp中 */
  12. void extract_data(char *line,char *temp)
  13. {
  14.     int     i = 0,j = 0,k = 0;

  15.     for ( ; line[i] != '=' ; i++ );
  16.     for ( ; line[i] != ' '; i++ );
  17.     for ( ; j <= i ; j++ )
  18.         temp[j] = line[j];
  19.     temp[j] = '\0';
  20.     printf("[+] %s\n",temp);
  21. }

  22. /* 检查输入ip合法性 */
  23. void check_ip(char *str)
  24. {
  25.     int i=0,count = 0;;

  26.     for ( ; i < strlen(str) ; i++ ) {
  27.         if ( !(str[i] >= '0' && str[i] <= '9' )) {
  28.             if ( str[i] == '.' ) {
  29.                 count++;
  30.                 continue;
  31.             }
  32.             printf("[-] Wrong IP.\n");
  33.             exit(0);
  34.         }
  35.     }

  36.     if (count == 3 )
  37.         printf("[+] IP check OK.\n");
  38.     else
  39.         printf("[-] Wrong IP.\n");

  40. }

  41. /* 替换ip */
  42. void load_file(FILE *s_fp)
  43. {
  44.     char    line[MAXLINE],new_line[MAXLINE],temp[MAXIP];
  45.     int     pos,len1,len2;
  46.     int     i = 0;

  47.     while ( fgets(line,MAXLINE,s_fp) != NULL ) {
  48.         if ( strstr(line,"MYSERVER_IP") != NULL ) {
  49.             extract_data(line,temp);
  50.             sprintf(new_line,"%s%s",temp,new_ip);
  51.             len1 = strlen(line);
  52.             len2 = strlen(new_line);
  53.             printf("[+] %s\n",line);
  54.             len1 = len1 - len2;
  55.             for ( ; i < len1 ; i++ )
  56.                 new_line[len2++] = ' ';
  57.             new_line[len2] = '\0';
  58.             printf("[+] %s\n",new_line);
  59.             pos = strlen(line);
  60.             fseek(s_fp,-pos,SEEK_CUR);
  61.             fputs(new_line,s_fp);
  62.             break;
  63.         }
  64.     }
  65. }

  66. int main(int argc,char **argv)
  67. {
  68.     FILE    *s_fp;

  69.     printf("[+] input your ip : ");
  70.     scanf("%s",new_ip);
  71.     printf("[+] new_ip : %s\n",new_ip);
  72.     check_ip(new_ip);
  73.     if ( (s_fp = fopen(DEFAULT_FILE,"r+")) == NULL ) {
  74.         printf("[-] open %s failed.\n",argv[1]);
  75.         exit(0);
  76.     }

  77.     load_file(s_fp);
  78.     fclose(s_fp);

  79.     printf("[+] done.\n");

  80.     return 0;
  81. }
复制代码

[ 本帖最后由 W.Z.T 于 2007-5-6 18:15 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2007-05-06 19:32 |只看该作者
fopen file
while fgets
if (MYSERVER_IP != buf)
    fputs to new file
else
    fprintf(newfile,"MYSERVER_IP = %s\n",newip)
rename;

论坛徽章:
0
13 [报告]
发表于 2007-05-06 19:45 |只看该作者
原帖由 flw2 于 2007-5-6 19:32 发表
fopen file
while fgets
if (MYSERVER_IP != buf)
    fputs to new file
else
    fprintf(newfile,"MYSERVER_IP = %s\n",newip)
rename;


楼上的可否注意到要把新字符串写回到原文件中,如果新字符串比原字符串短,是不能完全覆盖的。

论坛徽章:
0
14 [报告]
发表于 2007-05-06 19:55 |只看该作者
很感谢  W.Z.T 的热心回复,
你给的代码是没有错了。
不过不能达到效果,
也就是无法用输入的 IP 替换掉旧的 IP
代码正在看,再次感谢你的热心帮助,谢谢!

论坛徽章:
0
15 [报告]
发表于 2007-05-06 20:00 |只看该作者
应该是我没说清楚,
因为 = 号有多个
MYSERVER_IP  只有一个
也就是要把 MYSERVER_IP  = 后的 ip 给替换掉



.

论坛徽章:
0
16 [报告]
发表于 2007-05-06 21:23 |只看该作者
原帖由 attempt 于 2007-5-6 20:00 发表
应该是我没说清楚,
因为 = 号有多个
MYSERVER_IP  只有一个
也就是要把 MYSERVER_IP  = 后的 ip 给替换掉



.


什么叫= 号有多个?
举个例子嘛

论坛徽章:
0
17 [报告]
发表于 2007-05-07 00:50 |只看该作者
比如:
SERVER_PORT= 21
SERVERNAME= TEST
LOGINUSER= test
PWD= test

这边就有多个=号了

论坛徽章:
0
18 [报告]
发表于 2007-05-07 07:21 |只看该作者
给你一个最简单的方法,只是不检查IP的合法性. 没有编译过, 不过应该可以工作


  1. #define LINE_MAX 2048
  2. #define STRING_TO_FIND        "MYSERVER_IP"

  3. void replace_ip(char *in_file, char *out_file, char *new_ip)
  4. {
  5.         FILE         *fp_in,*fp_out;
  6.         int        len;
  7.         char        *s1,*s2,line[LINE_MAX];
  8.        
  9.         fp_in=fopen(in_file,"r");
  10.         if (fp_in==NULL) return;
  11.        
  12.         fp_out=fopen(out_file,"w");
  13.         if (fp_out==NULL) {
  14.                 fclose(fp_in);
  15.                 return;
  16.         }
  17.        
  18.         len=strlen(STRING_TO_FIND);
  19.         while (fgets(line, LINE_MAX, fp_in) != NULL) {
  20.                 s1=line;
  21.                 while (*s1&&strncasecmp(s1,STRING_TO_FIND,len))
  22.                         s1++;
  23.                 if (*s1!='\0') {
  24.                         s1+=len;
  25.                         s2=s1;
  26.                        //skip digit, space " ", "." and "="
  27.                         while (*s2&&(isdigit(*s2)||*s2==' '||*s2=='.'||*s2=='='))
  28.                                 s2++;
  29.                         *s1='\0';
  30.                         fputs(line,fp_out); //write first part of line to file
  31.                         fputs("=",fp_out); // write the "=" character to file
  32.                         fputs(new_ip,fp_out); // write the new IP to file
  33.                         fputs(s2,fp_out); // write rest of the line to file
  34.                 } else
  35.                         fputs(line,fp_out);
  36.         }
  37.         fclose(fp_in);
  38.         fclose(fp_out);
  39. }
复制代码

[ 本帖最后由 cxu123 于 2007-5-7 10:13 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2007-05-07 10:02 |只看该作者
原帖由 cxu123 于 2007-5-7 07:21 发表
给你一个最简单的方法,只是不检查IP的合法性. 没有编译过, 不过应该可以工作

[code]
#define LINE_MAX 2048
#define STRING_TO_FIND        "MYSERVER_IP"

void replace_ip(char *in_file, char *out_ ...


楼上的,lz要把新ip写回到原文件中,如果是写入新文件就很简单了,你那样做可以

论坛徽章:
0
20 [报告]
发表于 2007-05-07 10:10 |只看该作者
原帖由 W.Z.T 于 2007-5-7 10:02 发表


楼上的,lz要把新ip写回到原文件中,如果是写入新文件就很简单了,你那样做可以

新文件可以是临时文件, 把新文件拷贝回旧文件,覆盖旧文件. 一般都这么做,如果直接在旧文件上改,文件指针很难处理,而且容易出错. 没有这个必要用复杂的方法.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP