繁体   English   中英

C程序打印垃圾字符

[英]C program prints garbage characters

我有一个任务是用 C 编写一个程序,它的功能类似于 bash sed 's/oldstring/newstring/g',但只使用 stdio.h 和 string.h。 我们不能使用 malloc ,我们还没有在课堂上介绍它。 程序必须继续接受用户输入,直到用户输入 ^D。 我们正在使用 GCC,所以我将它设置为使用可变长度数组,并且我设法让程序在用户输入中查找和替换 oldstring 的单个实例。 但是,有时程序会输出一些垃圾字符,我不知道为什么。 我认为这是内存分配错误,或者程序正在读取我希望它读取的位置。 代码如下:

#include <stdio.h>
#include <string.h>
int isMatch(char * os, char * us){
    int i;
    char temp[strlen(os)];
    for(i=0; i<strlen(us); i++){
        int k=0;
        for(int j=i; j<i+strlen(os); j++){
            temp[k]=us[j];
            k++;
        }
        if(strcmp(temp, os)==0){
        return 1;
        }
        else{
            return 0;
        }
    }
}

void replace(char * os, char * us, char * ns, int loc){
    char out[strlen(us) - (strlen(os) - strlen(ns))];
    int i;
    for(i=0; i<loc; i++){
        out[i]=us[i];
    }
    int k=0;
    for(i=loc; i<loc+strlen(ns); i++){
        out[i]=ns[k];
        k++;
    }
    k=0;
    for(i=loc+strlen(ns); i<strlen(us)-(strlen(os)-strlen(ns)); i++){
        out[i]=us[loc+strlen(os)+k];
        k++;
    }
    printf("%s\n", out);
}

int main(int argc, char * argv[]){
    char input[100];
    int i;
    char c;
    int match;
    while(1){
        if(scanf("%c", &c)==EOF){
            break;
        }
        if((input[0]=c) != '\n'){
            for(i=1; i<100; i++){
                scanf("%c", &input[i]);
                if(input[i]=='\n'){
                    break;
                }
            }
        }
        for(i=0; i<100; i++){
            match = isMatch(argv[1], &input[i]);
            if(match == 1){
                replace(argv[1], input, argv[2], i);
            }
            if(input[i]=='\n'){
                break;
            }
        }
    }
}

例如,我用 ./a.out aa b 调用程序。

然后我输入 helaalo 并且程序吐出 helblo 这是正确的。 然后我输入libraary,程序输出librry,然后在新行中输出一些随机字符。 然后我输入caar,程序输出cbr,然后在新行上输出更多随机字母。 包括此行为的屏幕截图。 在这里你可以看到我尝试了 helaalo 两次,它运行良好,但随后图书馆得到了这个垃圾输出,caar 也是如此,尽管它似乎已经很好地替换了字符。

问题来自您填充输入缓冲区的方式。 您不要在字符串末尾添加 \\0。

还有一个“问题”,当您声明数组时,如果您想要动态大小,则需要使用 malloc。 您如何声明它不会有动态大小,数组的大小将在编译时计算。 只是为了记住它。

由于您不能使用 malloc,您可以强制为输入字符串的结尾和输出字符串的结尾添加终止 \\0,

// input
for(i=1; i<100; i++){
    scanf("%c", &input[i]);
    if(input[i]=='\n'){
        input[i] = '\0'; // add terminating \0 for input
        break;
    }
}
        
  
// out
for(i=loc+strlen(ns); i<strlen(us)-(strlen(os)-strlen(ns)); i++){
    out[i]=us[loc+strlen(os)+k];
    k++;
}
int len = strlen(us)-(strlen(os)-strlen(ns));
out[len] = '\0'; // for out termiante \0
printf("%s\n", out);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM