Program works but outputs trailing garbage values

时间:2018-11-03 19:26:13

标签: c

I am working on a code that gives the steps to change one string into another and it works fine but gives garbage values.

The code is:

void steps(char str1[],char str2[]) {
    int belongs,req;
    strlwr(str1);
    strlwr(str2);
    if(strlen(str1)==strlen(str2)) {
        for(int i=0;i<=strlen(str1);i++) {
            if(str2[i]!=str1[i]) {
                ++changes;
                printf("%d::SUBSTITUTION:: %c <--- %c\n",changes,str1[i],str2[i]);
                str1[i]=str2[i];
                printf("--->%s\n",str1);
            }
        }
    }

    if(strlen(str1)>strlen(str2)){
        for(int i=strlen(str1);i>=strlen(str2);i--) {
            if(str1[i]=='\0') {
            }
            else {
                ++changes;
                printf("%d::DELETE:: %c\n",changes,str1[i]);
                str1[i]=0;
                printf("--->%s\n",str1);
            }
        }
    }

    if(strlen(str1)<strlen(str2)) {
        for(int i=(strlen(str1));i<=(strlen(str2)-1);i++) {
            ++changes;
            printf("%d::ADD:: %c\n",changes,str2[i]);
            str1[i]=str2[i];
            printf("-->%s\n",str1);
        }
    }
    steps(str1,str2);
}

The output for the input strings, suppose 'sym' and 'symbiosis' is:

    1::ADD:: b
    -->symb
    2::ADD:: i
    -->symbi
    3::ADD:: o
    -->symbio
    4::ADD:: s
    -->symbios
    5::ADD:: i
    *-->symbiosiDzb
    6::ADD:: s
    -->symbiosis²b
    7::DELETE:: b
    --->symbiosis²
    8::DELETE:: ²
    --->symbiosis*

At step 5 and beyond, why is it showing me garbage values?

I tried the best I could and due to my limited knowledge in C (and pointers) I am reluctant to use pointers and hence hesitate a bit with DMA. Also, a strange thing that I noticed is that the garbage values occur only when the difference between the strings is large. Please help me fix it!

2 个答案:

答案 0 :(得分:2)

if(strlen(str1)<strlen(str2)){
    for(int i=(strlen(str1));i<=(strlen(str2)-1);i++){
        ++changes;
        printf("%d::ADD:: %c\n",changes,str2[i]);
        str1[i]=str2[i];
        printf("-->%s\n",str1);
    }}

在该代码段中,执行str1[i]=str2[i];的部分可能是非法的。 首先,C中的字符串以空终止。这意味着字符串在空字节到来时结束。因此,如果添加字符,则将覆盖空字节。因此,您必须确保其后的字符是一个空字节,否则字符串将在下一个空字节进入内存时结束。那就是垃圾数据的来源。 这样就可以了:

str1[i]=str2[i];
str1[i + 1]=0;

此外,您必须确保缓冲区足够大。这意味着您在调用步骤时为str1保留的内存可能不足以追加字符。从技术上讲,您仍然可以添加新字符,但是您可能正在做的是使缓冲区溢出并写入您不属于自己的内存。这可能很关键。

您可以做的是分配一个具有足够内存的新缓冲区来容纳您的新字符串。然后可以将str1复制到其中,然后附加str2中的字符。

例如这样的例子:

char buffer[512];
buffer[0] = 0;

// Write str1 into the buffer
strcat(buffer, str1);

// [...]

// Instead of 'str1[i]=str2[i];'
buffer[i]=str2[i];
buffer[i + 1] = 0;

在此示例中,您仍然必须确保str1和str2均小于512字节,否则您必须使用malloc(和{{3} })。

要提供一个更好的示例,可能会有助于您了解如何调用steps函数。

答案 1 :(得分:-1)

谢谢大家!

我能够解决问题...

工作代码为:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int changes=0;
void steps(char str1[],char str2[]){
    char* temp;
    temp=(char *)malloc((strlen(str2)));//Buffer of size of string 2 to store string 1 
    unsigned int length_1=strlen(str1);
    unsigned int length_2=strlen(str2);
int belongs,req;
strlwr(str1);
strlwr(str2);//To avoid conversion of same letters but in different cases

//Strings of equal length:      
if(strlen(str1)==strlen(str2)){
for(int i=0;i<=strlen(str1);i++){
        //Strings with no swapping possible:
        if(str2[i]!=str1[i]){
            ++changes;
            printf("%d::SUBSTITUTION:: %c <--- %c\n",changes,str1[i],str2[i]);
            str1[i]=str2[i];
            printf("--->%s\n",str1);
        }}}

//String 1 is longer than string 2, hence deletion:
if(strlen(str1)>strlen(str2)){
        for(int i=strlen(str1);i>=strlen(str2);i--){
            ++changes;
            printf("%d::DELETE:: %c\n",changes,str1[i]);
            str1[i]=0;
            printf("--->%s\n",str1);
        }
    }
//String 2 is longer than string 1, hence addition:
if(strlen(str1)<strlen(str2)){
        strcpy(temp,str1);
        for(int i=(strlen(str1));i<strlen(str2);i++){
            if (str2[i]=='\0'){
            }
        else{
        ++changes;
        printf("%d::ADD:: %c\n",changes,str2[i]);
        *(temp+i)=str2[i];
        *(temp+1+i)=0;
        printf("-->%s\n",temp);
    }}
    char newstr[length_2];//Use to store 'temp' and use in steps function again
    strcpy(newstr,temp);
    steps(newstr,str2);
    }   
free(temp); //Release memory
}//End!