2017-12-24 2 views
-3
#include <stdio.h> 
#include <assert.h> 
#include <stdlib.h> 
#include <string.h> 

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

char * str = "Testing replace text...\n\n"; 


     char* buffer = malloc(sizeof(char)); 
     char* insertPoint = &buffer[0]; 
     char* copy = str; 
     char* p = strstr(str, "epl"); 
     char* g = "gard"; 
     int size = 0; 

     size = p-copy; //p = 9, which is the number of elemts till the first element of the substring 
         //want to allocate this space, and then increment insertPoint, by that amt(it'll be pointing 
         // to nothing) 
     buffer = realloc(buffer, size); 
     printf("Size: %d\n", size); 
     memcpy(insertPoint, copy, size); 
     printf("COPY: %s\n", buffer); 

     copy += size; 
     buffer = realloc(buffer, size+strlen(g)); 
     insertPoint += size; 
     printf("%c", *insertPoint); 
     memcpy(insertPoint, g, strlen(g)); //insert after the 9 letters, the string the size of g 
     size += strlen(g); //size if the size of the buffer 
     printf("Size2: %d\n", size); 
     printf("COPY2: %s\n", buffer); 

    return EXIT_SUCCESS; 
} 

ちょっとした実験コードです。私はstrの部分文字列eplを "gard"と置き換えようとしていますが、文字列バッファーに変更はありません。つまり、最初の文字列を意味しています。サブストリングが発生しますが、サブストリングで置換しようとすると機能しません。私は個々のポインタをテストしており、それらはすべて正しいように見えます...何が起こっているかわからない、どんな洞察?ありがとう...完全に実行可能なプログラム。サブストリングを見つけてCで置き換えます

+0

[Cでの文字列を置換する機能は何ですか?](https://stackoverflow.com/questionsの可能性のある重複/ 779875/what-is-the-function-to-c-string-in-c) –

+0

私はC言語で部分文字列置換を行う方法を見てきましたが、この小さなプログラムをこのサイトの答えの1つに基づいています - それは動作していません。これに加えて、このコードの特定の問題があります@AndrewWatson – GCGSAUCE

+1

'malloc(sizeof(char))'が間違っています。むしろ、NULLに初期化してください。 –

答えて

0

以下のコードを試すことができます。私はあなたのコードを修正しようとしましたが、最終的には、それを新たに書き直し(そしてもっと賢明な変数名を使用して)簡単に書き直すことができました。

以下の簡単な4つのステップが機能します。 strlenの連続使用は変数で置き換えてもよいが、わかりやすくするために残しておきます。 (また、良いコンパイラは非常によく通話を残すことによって、このコードを最適化することができる。)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{  
    char *str = "Testing replace text...\n\n"; 
    char* buffer; 
    char* find_str = "epl"; 
    char* repl_str = "gard"; 

    char *find_str_pos = strstr (str, find_str); 

    /* 1. create new buffer of the correct size */ 
    buffer = malloc (strlen(str) - strlen(find_str) + strlen(repl_str) + 1); 
    /* 2. copy first part */ 
    memcpy (buffer, str, find_str_pos - str); 
    /* 3. add new text */ 
    memcpy (buffer + (find_str_pos - str), repl_str, strlen(repl_str)); 
    /* 4. append original text */ 
    memcpy (buffer + (find_str_pos - str) + strlen(repl_str), find_str_pos + strlen(find_str), strlen(find_str_pos) - strlen(repl_str) + 1); 

    printf ("-> [%s]\n", buffer); 

    return EXIT_SUCCESS; 

} 
0

"epl"を置き換えた後、残りのテキスト "ace text ..."を追加していません。

あなたは私がstrlenが終了ゼロが含まれていないので、あなたのコードに問題が発生したと思わ

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

int main() { 

    char *source_string = "Testing replace text..."; 
    char *search_string = "epl"; 
    char *replace_string = "gard"; 

    int search_length = strlen(search_string); 
    int replace_length = strlen(replace_string); 

    // Find start position of search string 
    char *start = strstr(source_string, search_string); // start pointing to "eplace text..." 
    int intial_length = start - source_string; // intial_length = 9 

    // Get remaining text which should append after replace 
    char *remaining_string = (start + search_length); // remaining_string pointing to "ace text..." 
    int remaining_length = strlen(remaining_string); // remaining_length = 11 

    // Find total length of string after replacing text 
    int total_string_length = intial_length + replace_length + remaining_length; // 24 

    char *buffer = (char *)malloc(total_string_length + 1); // +1 for null pointer 
    char *current_index = buffer; 

    // Add initial text 
    memcpy(current_index, source_string, intial_length); 
    current_index += intial_length; 

    // Add replace text 
    memcpy(current_index, replace_string, replace_length); 
    current_index += replace_length; 

    // Add remaining text 
    memcpy(current_index, remaining_string, remaining_length); 
    current_index += remaining_length; 

    memcpy(current_index, "\0", 1); // add null pointer at last 
    printf("Final Output: %s", buffer); // Final Output: Testing rgardace text... 

    return 0; 
} 
関連する問題