精华内容
下载资源
问答
  • 学习使用函数之前,先来看一下函数语法结构。函数调用和变量调用很像。...调用函数时候要使用字符“$”,后面可以跟小括号也可以使用花括号。这个其实我们并不陌生,我们之前使用过许多函数,...

    学习使用函数之前,先来看一下函数的语法结构。函数的调用和变量的调用很像。引用变量的格式为$(变量名),函数调用的格式如下:

    $()    或者是     ${}

    其中,function 是函数名,arguments 是函数的参数,参数之间要用逗号分隔开。而参数和函数名之间使用空格分开。调用函数的时候要使用字符“$”,后面可以跟小括号也可以使用花括号。这个其实我们并不陌生,我们之前使用过许多的函数,比如说展开通配符的函数 wildcard,以及字符串替换的函数 patsubst ,Makefile 中函数并不是很多。

    今天主要讲的是字符串处理函数,这些都是我们经常使用到的函数,下面是对函数详细的介绍。

    1. 模式字符串替换函数,函数使用格式如下:

    $(patsubst ,,)

    函数说明:函数功能是查找 text 中的单词是否符合模式 pattern,如果匹配的话,则用 replacement 替换。返回值为替换后的新字符串。实例:

    OBJ=$(patsubst %.c,%.o,1.c 2.c 3.c)

    all:

    @echo $(OBJ)

    执行 make 命令,我们可以得到的值是 "1.o 2.o 3.o",这些都是替换后的值。

    2. 字符串替换函数,函数使用格式如下:

    $(subst ,,)

    函数说明:函数的功能是把字符串中的 form 替换成 to,返回值为替换后的新字符串。实例:

    OBJ=$(subst ee,EE,feet on the street)

    all:

    @echo $(OBJ)

    执行 make 命令,我们得到的值是“fEEt on the strEEt”。

    3. 去空格函数,函数使用格式如下:

    $(strip )

    函数说明:函数的功能是去掉字符串的开头和结尾的字符串,并且将其中的多个连续的空格合并成为一个空格。返回值为去掉空格后的字符串。实例:

    OBJ=$(strip a b c)

    all:

    @echo $(OBJ)

    执行完 make 之后,结果是“a b c”。这个只是除去开头和结尾的空格字符,并且将字符串中的空格合并成为一个空格。

    4. 查找字符串函数,函数使用格式如下:

    $(findstring ,)

    函数说明:函数的功能是查找  in 中的 find ,如果我们查找的目标字符串存在。返回值为目标字符串,如果不存在就返回空。实例:

    OBJ=$(findstring a,a b c)

    all:

    @echo $(OBJ)

    执行 make 命令,得到的返回的结果就是 "a"。

    5. 过滤函数,函数使用格式如下:

    $(filter ,)

    函数说明:函数的功能是过滤出 text 中符合模式 pattern 的字符串,可以有多个 pattern 。返回值为过滤后的字符串。实例:

    OBJ=$(filter %.c %.o,1.c 2.o 3.s)

    all:

    @echo $(OBJ)

    执行 make 命令,我们得到的值是“1.c 2.o”。

    6. 反过滤函数,函数使用格式如下:

    $(filter-out ,)

    函数说明:函数的功能是功能和 filter 函数正好相反,但是用法相同。去除符合模式  pattern 的字符串,保留符合的字符串。返回值是保留的字符串。实例:

    OBJ=$(filter-out 1.c 2.o ,1.o 2.c 3.s)

    all:

    @echo $(OBJ)

    执行 make 命令,打印的结果是“3.s”。

    7. 排序函数,函数使用格式如下:

    $(sort )

    函数说明:函数的功能是将 中的单词排序(升序)。返回值为排列后的字符串。实例:

    OBJ=$(sort foo bar foo lost)

    all:

    @echo $(OBJ)

    执行 make 命令,我们得到的值是“bar foo lost”。

    注意:sort会去除重复的字符串。

    8. 取单词函数,函数使用格式如下:

    $(word ,)

    函数说明:函数的功能是取出函数中的第n个单词。返回值为我们取出的第 n 个单词。实例:

    OBJ=$(word 2,1.c 2.c 3.c)

    all:

    @echo $(OBJ)

    执行 make 命令,我们得到的值是“2.c”。

    展开全文
  • ``` #include #include #include void replace(char *path,char *str,char *newstr); ...int main(int argc,char *argv[]) ... if (strcmp(argv[1], ...要想实现将文本文件中的str替换成newstr,请问上述代码哪里有问题
  • /* Filename: word-replace.c* Description: 替换文件中指定单词为其他字符串并输出到指定的文件中*/#include#include#include#include#define MAX_WORDS_LEN 50 // 单词最大长度限制typedef e...

    匿名用户

    1级

    2009-06-11 回答

    给你个单词替换的例子,稍微改改就可以达到你的要求了。

    /* Filename: word-replace.c

    * Description: 替换文件中指定的单词为其他字符串并输出到指定的文件中

    */

    #include

    #include

    #include

    #include

    #define MAX_WORDS_LEN 50 // 单词的最大长度限制

    typedef enum { FALSE = 0, TRUE = 1 } BOOL;

    struct Word {

    char str[MAX_WORDS_LEN + 1]; // 存储字符串

    BOOL isWord; // 是否为单词

    };

    typedef struct Node { // 使用链表存储解析后的字符串

    struct Word word;

    struct Node *next;

    } *List;

    enum Option { // 单词替换选项

    MATCH_WORD_CASE, // 精确匹配单词区分大小写

    MATCH_WORD_NOCASE, // 匹配单词但不区分大小写

    };

    // 函数功能:出错处理方法,打印出错信息并退出程序

    void complain(const char *msg)

    {

    printf("%s\n", msg);

    exit(EXIT_FAILURE);

    }

    // 函数功能:将结构体单词 w 插入不带头节点的单向不循环链表 L 的末尾

    // 参数L:不带头节点的单向不循环链表的表头指针

    // 参数w:指向待插入链表 L 的结构体单词信息的指针

    void insert_list(List * L, const struct Word *w)

    {

    struct Node *node = (struct Node *)malloc(sizeof(struct Node));

    node->word = *w, node->next = NULL;

    if (*L != NULL) { // 链表非空,则寻找链表的末尾并插入

    struct Node *p;

    for (p = *L; p->next != NULL; p = p->next) ;

    p->next = node;

    } else // 链表为空,直接插入

    *L = node;

    }

    // 函数功能:打印不带头节点的单向不循环链表,参数L为该链表的表头指针

    void print_list(List L)

    {

    for (struct Node * p = L; p; p = p->next)

    printf("%s|%d\n", p->word.str, p->word.isWord);

    }

    // 函数功能:销毁不带头节点的单向不循环链表,参数L为该链表的表头指针

    void dump_list(List L)

    {

    for (struct Node * p = L, *n; p; p = n) {

    n = p->next;

    free(p);

    }

    }

    // 函数功能:不区分大小写的字符串比较函数,该函数不是标准C语言的库函数

    int stricmp(const char *dst, const char *src)

    {

    int ch1, ch2;

    do {

    if (((ch1 = (unsigned char)(*(dst++))) >= 'A') && (ch1 <= 'Z'))

    ch1 += 0x20;

    if (((ch2 = (unsigned char)(*(src++))) >= 'A') && (ch2 <= 'Z'))

    ch2 += 0x20;

    } while (ch1 && (ch1 == ch2));

    return (ch1 - ch2);

    }

    // 函数功能:解析文件指针fp_ro所指文件中的字符串,将其中的单词和非单词分离

    // 出来,并将分离的结果存储到不带头节点的单向不循环链表L中。如果

    // 函数成功执行,返回TRUE,否则返回FALSE。

    BOOL word_parse(FILE * fp_ro, List * L)

    {

    if (fseek(fp_ro, 0L, SEEK_END))

    return FALSE;

    const long fsize = ftell(fp_ro);

    if (fseek(fp_ro, 0L, SEEK_SET))

    return FALSE;

    char *buf = (char *)malloc(fsize + 1);

    if (buf && fread(buf, fsize, 1, fp_ro) != 1 && ferror(fp_ro))

    complain("Internal error.");

    struct Word w;

    char pword[MAX_WORDS_LEN + 1];

    for (size_t i = 0, index = 0; i < (size_t) fsize;) {

    index = 0;

    while (!isalpha(buf[i]) && i < (size_t) fsize) { // 非字母

    pword[index++] = buf[i++];

    if (index == MAX_WORDS_LEN) { // 缓冲区溢出情况的处理

    pword[index] = '\0'; // strncpy不自动添加'\0'

    strncpy(w.str, pword, index + 1);

    w.isWord = FALSE;

    insert_list(L, &w);

    index = 0;

    }

    }

    if (index != 0) {

    pword[index] = '\0'; // strncpy不自动添加'\0'

    strncpy(w.str, pword, index + 1);

    w.isWord = FALSE;

    insert_list(L, &w);

    }

    index = 0;

    while (isalpha(buf[i]) && i < (size_t) fsize) { // 单词

    pword[index++] = buf[i++];

    if (index == MAX_WORDS_LEN) // 缓冲区溢出情况的处理

    complain("Too long word in source file.");

    }

    if (index != 0) {

    pword[index] = '\0'; // strncpy不自动添加'\0'

    strncpy(w.str, pword, index + 1);

    w.isWord = TRUE;

    insert_list(L, &w);

    }

    }

    free(buf);

    return TRUE;

    }

    // 函数功能:根据替换选项opt,替换在不带头节点的单向不循环链表L中的

    // 单词fnd为新的字符串rep,并返回替换的次数。

    int word_replace(List L, enum Option opt, const char *fnd, const char *rep)

    {

    int rep_cnt = 0; // 替换发生的次数

    switch (opt) {

    case MATCH_WORD_CASE:

    for (struct Node * p = L; p; p = p->next)

    if (p->word.isWord == TRUE && strcmp(p->word.str, fnd) == 0)

    strcpy(p->word.str, rep), rep_cnt++;

    break;

    case MATCH_WORD_NOCASE:

    for (struct Node * p = L; p; p = p->next)

    if (p->word.isWord == TRUE && stricmp(p->word.str, fnd) == 0)

    strcpy(p->word.str, rep), rep_cnt++;

    break;

    default:

    fprintf(stderr, "Invalid option for function %s.", __func__);

    }

    return rep_cnt;

    }

    // 函数功能:将不带头节点的单向不循环链表 L 中的单词(字符串)按顺序存入由

    // fp_wr所指的文件中。如果函数成功执行,返回TRUE,否则返回FALSE。

    BOOL word_save(FILE * fp_wr, List L)

    {

    if (fseek(fp_wr, 0L, SEEK_SET))

    return FALSE;

    for (struct Node * p = L; p; p = p->next)

    fprintf(fp_wr, "%s", p->word.str);

    return TRUE;

    }

    // 程序功能:以文件为单位,执行单词替换

    // 参数格式:命令 源文件 目标文件 查找的单词 替换的单词

    int main(int argc, const char *argv[])

    {

    // 参数合法性检查

    if (argc != 5 || strcmp(argv[1], argv[2]) == 0 ||

    strlen(argv[3]) > MAX_WORDS_LEN || strlen(argv[4]) > MAX_WORDS_LEN)

    complain("参数错误!\n"

    "参数格式:命令 源文件 目标文件 查找的单词 替换的单词");

    FILE *fin = fopen(argv[1], "rt");

    FILE *fout = fopen(argv[2], "wt");

    const char *const fnd = argv[3];

    const char *const rep = argv[4];

    if (fin == NULL || fout == NULL)

    complain("文件输入输出错误!\n");

    List L = NULL; // 不带头结点的单向链表的表头指针

    if (word_parse(fin, &L) == FALSE)

    complain("Parse error.");

    print_list(L);

    int rep_cnt = word_replace(L, MATCH_WORD_CASE, fnd, rep);

    printf("共发生替换 %d 次。\n", rep_cnt);

    word_save(fout, L);

    dump_list(L);

    fclose(fin);

    fclose(fout);

    return 0;

    }

    展开全文
  • 实现在windows系统下的字符串替换,通过搜索子字符串在文本文件中的出现的位置,实现替换。
  • 基于c语言的字符串替换函数,可以在Linux系统使用已编写好的makefile文件编译,非常实用,通过文本输入直接修改文本需要替换的字符串
  • 上面是配置文件,程序已取得2个字符串 char*passWord="pass123";char*UserFileName="User.p12"; 如何将$$P替换为pass123,$$U替换为User.p12,然后调用exe程序,将参数传入,也就是执行 > certutil.exe -p ...
  • 将如下函数添加到文件中,可直接调用。 StrReplace(char strRes[],char from[], char to[]) @strRes[] :原始字符串。 @rom[]:需要替换的字符,串只替换第一次出现的位置。 @to[]:需要替换成什么字符串。 成功...

    将如下函数添加到文件中,可直接调用。

    StrReplace(char strRes[],char from[], char to[])

    @strRes[] :原始字符串。

    @rom[]:需要替换的字符,串只替换第一次出现的位置。

    @to[]:需要替换成什么字符串。

    成功返回:1

    失败返回:0

    #include <malloc.h>
    #include<netinet/in.h>  
    #include <net/if.h>
    #include <sys/ioctl.h>
    
    int StrReplace(char strRes[],char from[], char to[])
     {
        int flag=0;
    	char *Ptr = NULL;
        char *middle_flag = strstr(strRes, from);
    	if(middle_flag == NULL)
    	{
    		return flag;
    	}
        
        int len = strlen(middle_flag);
        Ptr = (char *)malloc(len * sizeof(char));
        if (NULL == Ptr)
        {
            return flag;
        }
        strcpy(Ptr, middle_flag + (strlen(from)));
        if (middle_flag != NULL)
        {
            /* code */
            *middle_flag = '\0';
            strcat(strRes, to);
            strcat(strRes, Ptr);
            free(Ptr);
            flag = 1;
        }
        return flag;
     }
    
    int main()
    {
        char *str = "this is one";
        if(StrReplace(str,"one","two"))
        {
         printf("%s",str);
        }
    }
    
    @print:this is two

    输出this is two

    展开全文
  • c语言 文件 字符串添加,或替换,或修改 有a.txt内容为 a=1 x!=22 b=333 d=4444 现在要将要a.txt内容改为 a=100 b=2 c=3 d=4444 即是: 1.在1后面添加00 2.删除第二行 3.删除第三行后两个3 4.添加一行c=3 ...
  • C语言字符替换

    2020-03-29 12:51:56
    函数 ReadDat()实现从文件 ENG.IN 中读取一篇英文文章,存入到字符串数组 xx 中;请编制函数 encryptChar(),按给定的替代关系对数组 xx 中的所有字符进行替代,仍存入数组 xx 的对应的位置上,后调用函数 ...

    如题

    函数 ReadDat()实现从文件 ENG.IN 中读取一篇英文文章,存入到字符串数组 xx 中;请编制函数 encryptChar(),按给定的替代关系对数组 xx 中的所有字符进行替代,仍存入数组 xx 的对应的位置上,后调用函数 WriteDat()把结果 xx 输出到文件 PS1.DAT 中。

    替代关系:f(p)=p*11 mod 256(p 是数组中某一个字符的 ASCII 值,f(p)是计算后新字 符的 ASCII 值),如果计算后 f(p)值小于等于 32 或大于 130,则该字符不变,否则将 f(p)所对应的字符进行替代。(注意中间变量用无符号整型),原始数据文件存放的格式是:每行的宽度均小于 80 个字符。

    话不多说了,直接上代码

    #include <stdio.h>
    
    #include <string.h>
    
    #include <conio.h>
    
    #include <ctype.h>
    
    unsigned char xx[50][80];
    
    int maxline=0;/*文章的总行数*/
    
    int ReadDat(void);
    
    void WriteDat(void);
    
    void encryptChar()
    
    {
    
    int i,j;
    
    for(i=0;i<maxline;i++)
    
    for(j=0;j<strlen(xx[i]);j++)
    
    if(xx[i][j]*11%256<=32||xx[i][j]*11%256>130) continue;
    
    else xx[i][j]=xx[i][j]*11%256;
    
    }
    
    void main()
    
    {
    
    clrscr();
    
    if(ReadDat()){ printf("数据文件 ENG.IN 不能打开!\n\007");
    
    return;
    
    }
    
    encryptChar();
    
    WriteDat();
    
    }
    
    int ReadDat(void)
    
    {
    
    FILE *fp;
    
    int i=0;
    
    unsigned char *p;
    
    if((fp=fopen("eng.in","r"))==NULL) return 1;
    
    while(fgets(xx[i],80,fp)!=NULL){
    
    p=strchr(xx[i],'\n');
    
    if(p)*p=0; i++; } maxline=i;
    
    fclose(fp); return 0;
    
    }
    
    void WriteDat(void)
    
    {
    
    FILE *fp;
    
    int i;
    
    fp=fopen("ps1.dat","w");
    
    for(i=0;i<maxline;i++){
    
    printf("%s\n",xx[i]);
    
    fprintf(fp,"%s\n",xx[i]);
    
    }
    
    fclose(fp);
    
    }
    

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处
    本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105176926

    展开全文
  • 宏定义在 C语言中,是一种很常见的...项目运用的背景如下:项目中有个头文件中定义了一个宏定义,比如是 #define CFG_LOGGER_NAME uart然后,在某个C文件中需要讲这个3转换成对应的字符串类型,即为"uart";很明显,...
  • C语言中的替换

    2021-01-03 18:07:08
    #define替换规则 在程序扩展#define定义符号和宏 1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义符号,其首先被调换 ...2.预处理器搜索#define定义符号时,字符串常量不被搜索 ...
  • c语言中的替换

    2020-10-21 15:26:20
    #define替换规则 在程序扩展#define定义符号和宏 1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义符号,其首先被调换 ...2.预处理器搜索#define定义符号时,字符串常量不被搜索 ...
  • C语言文件replace.c

    2020-04-13 20:49:36
    题目描述:编写程序将一个指定文件中某一字符串替换为另一个字符串。要求:(1)被替换字符串若有多个,均要被替换;(2)指定被替换字符串,大小写无关。 【输入形式】 给定文件名为filein.txt。从控制台输入两行...
  • 为了保险起见,在省与省之间传递的重要文件中的大写字母是加密的。当时最流行的加密方法是替换和重新排列。替换方法是将所有出现的字符替换成其它的字符。有些字符会替换成它自己。例如:替换规则可以是将'A' 到 'Y'...
  • C语言中的宏定义

    千次阅读 2013-05-24 11:10:39
    替换列表是一系列的C语言记号,包括标识符、关键字、数、字符常量、字符串字面量、运算符和标点符号。当预处理器遇到一个宏定义时,会做一个 “标识符”代表“替换列表”记录。在文件后面内容,不管标识符在...
  • C语言中的

    2018-06-21 15:33:59
    宏定义是C提供三种预处理功能其中一种,这三种预处理包括:宏定义、文件包含、条件编译宏定义又称为宏代换、宏替换,简称“宏”。格式:#define 标识符 字符串其中标识符就是所谓符号常量,也称为“宏名”。...
  • 1.fprintf int fprintf(FILE *stream, const ...format -- 这是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化...
  • c语言中的编译预处理命令

    千次阅读 2020-06-16 15:56:39
    作用: 用一个简单的名称代替一个长的字符串。 标识符 称为”宏名“ 在编译时将宏名替换成字符串的过程称为”宏展开“或宏替换 作用范围:定义之后,直到本文件末尾,但可用#undef终止作用域 2.带参宏 定义格式: #...
  • Linux中C语言的预处理

    2016-10-08 22:45:32
    1.预处理阶段gcc -o hello.i hello.c -E进行宏替换(宏的本质是发生在预处理阶段单纯的字符串替换)#define R 10预处理时只是将.c文件中的R替换为字符串“10”。1)宏函数#define R 20 # define N(n) n*10 //在main...
  • C语言中的三大预编译功能

    千次阅读 2017-04-07 16:53:40
    这三种预处理包括:宏定义、文件包含、条件编译。 宏定义是C语言提供三种预处理功能其中一种。宏定义和操作符区别是:宏定义是替换,不做...预处理(预编译)工作也叫做宏展开:将宏名替换字符串。 掌握
  • 3.1.0 宏定义 3.1.0.0 简单宏 (1)格式 ...在以后的文件中,不管标识符在哪里出现,预处理器都会用替换列表替代它。 3.1.0.1 带参数宏 1、格式 #define 标识符(x1,x2,x3…) 替换列表 注意:在...
  • 命令如上 把旧文件中的旧单词替换成新单词 然后输入到新文件中去。我的问题是程序会一直往新文件里面打印字符串不会停止。 代码如下,希望有大大可以帮我解答一下。谢谢啦! 1 #include <stdio.h> 2 #...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 269
精华内容 107
关键字:

c语言文件中的字符串替换

c语言 订阅