[英]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,然后在新行上输出更多随机字母。 包括此行为的屏幕截图。
问题来自您填充输入缓冲区的方式。 您不要在字符串末尾添加 \\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.