Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序打印垃圾字符_C_Gcc - Fatal编程技术网

C程序打印垃圾字符

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

我的任务是用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;
            }
        }
    }
}
#包括
#包括
int isMatch(char*os,char*us){
int i;
字符温度[strlen(os)];

对于(i=0;i而言,问题来自于填充输入缓冲区的方式。您没有在字符串末尾添加\0


还有一个“问题”,在声明数组时,如果需要动态大小,则需要使用malloc。声明数组的方式将不会有动态大小,数组的大小将在编译时计算。请记住。

问题在于填充输入缓冲区的方式。您不会在st结尾添加\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);
//输入

对于(i=1;i由于不能使用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);
//输入
对于(i=1;i