Roger Almengor
Roger Almengor

Reputation: 464

Replace ending of string in C using backwards for loop

I am trying to replace the last part of a string using a for backward for loop iterating for every element of the original string and assigning the first (last elements because I am iterating backwards in the for loop) elements to the string scl = "SCL_10m.tif", and the rest when the counter hits lower than 15, then get all the characters from the string string, and assign them to the newString. However at the end the result is:

The old string was: S2_2018_08_09_B02_10m.tif
The new string is S2_2018_08_09_B0old string:

Which is different from my expected result:

The new string is S2_2018_08_09_SCL_10m.tif

I don't know what that happened. It supposed to iterate over all the elements of the newString Since it is the same size as the original string. I checked some replace string functions in C, but I wanted to implement something that helps me fast at this particular replace substring in String problem.

Dealing with String in C is very complicated and I am still learning some theory about it, such as: the null Byte and so on. Coming from JavaScript, Python, and Ruby where more of this functions are already implemented in some standard library, I find very hard and at the same time helpful to get the idea of how to implement such algorithms from scratch to deal with specific problems in my code. I appreciate any idea or hint about what is happening in the code below:


/******************************************************************************

                    Replace last 11 characters in a longer string
                    by the values of a smaller (11-char long) string.

*******************************************************************************/

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

int main()
{
    char *string;
    string =  "S2_2018_08_09_B02_10m.tif";
    char *scl; 
    scl =  "SCL_10m.tif";
    int length = 0;
    int length_scl = 0;
    length_scl = strlen(scl);
    length = strlen(string);
    char newstring[length];
    int i;
    int cntr = length;
    for (i = length; i >= 0; i--)
    {
        if(cntr > 15){
            newstring[i] = scl[i];
            cntr--;
        }
        else if(cntr <= 15)
        {
            newstring[i] = string[i];
        }


    }
    printf("The old string was: %s\n", string);
    printf("The new string is %s:\n", newstring);

    return 0;
}

Upvotes: 0

Views: 106

Answers (1)

0___________
0___________

Reputation: 67835

char *func1(char *new, const char *src, const char *repl)
{
    size_t src_len, repl_len;

    if(src && repl)
    {
        src_len = strlen(src);
        repl_len = strlen(repl);
        if(src_len >= repl_len)
        {
            new[src_len] = 0;
            while(repl_len)
            {
                new[--src_len] = repl[--repl_len];
            }
            if(src_len)
            {
                while(--src_len)
                {
                    new[src_len] = src[src_len];
                }
            }
        }
    }
    return new;
}

char *func2(char *new, const char *src, const char *repl, size_t nchars)
{
    //last nchars only (inluding the nul char)
    size_t src_len, repl_len;

    if(new &&src && repl)
    {
        new[--nchars] = 0;
        src_len = strlen(src);
        repl_len = strlen(repl);
        if(src_len >= repl_len)
        {
            while(repl_len && nchars)
            {
                new[--nchars] = repl[--repl_len];
                --src_len;
            }
            if(src_len && nchars)
            {
                while(--src_len && --nchars)
                {
                    new[nchars] = src[src_len];
                }
            }
        }
    }
    return new;
}

int main()
{
    char *string =  "S2_2018_08_09_B02_10m.tif";
    char *repl =  "SCL_10m.tif";
    char new[256];
    printf("func1 - new = \"%s\", src = \"%s\", repl = \"%s\"\n", func1(new, string, repl), string, repl);
    printf("func2 - new = \"%s\", src = \"%s\", repl = \"%s\"\n", func2(new, string, repl, 15), string, repl); 
    printf("func2 - new = \"%s\", src = \"%s\", repl = \"%s\"\n", func2(new, string, "123456789_SCL_10m.tif", 15), string, repl); 
    return 0;
}

Upvotes: 1

Related Questions