【发布时间】:2016-10-08 22:56:55
【问题描述】:
我的任务是编写一个字符串,然后编写该字符串的一部分,该部分需要用另一个字符串替换。我设法让它工作,但如果被替换的字符串比需要替换的那部分字符串更长,它只会“吃掉”一些字母。我能在这个任务上得到一点帮助吗? 工作代码示例:
输入:
This is a beautiful day.
END
输入2:
a be
输入3:
not a bee
预期输出:
This is not a beeautiful day.
我的输出:
This is not a beeful day.
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX 1000
main(){
char unos[MAX+1];
int i = 0;
char c;
printf("Enter text. For end type END\n");
while (1){
scanf("%[^\n]%*c", unos, &c);
i = strstr(unos, "END") - unos;
if (i >= 0){
unos[i] = '\0';
break;
}
}
char trazena_zamjena[MAX + 1] = "\0";
char zamjena[MAX + 1];
printf("Enter part that needs to be replaced : ");
i = 0;
do{
scanf("%c", &trazena_zamjena[i]);
if (trazena_zamjena[i] == '\n') {
trazena_zamjena[i] = '\0';
break;
}
i++;
} while (trazena_zamjena[i] != '\n');
printf("Enter replacing text : ");
i = 0;
do{
scanf("%c", &zamjena[i]);
if (zamjena[i] == '\n') {
zamjena[i] = '\0';
break;
}
i++;
} while (zamjena[i] != '\n');
int l = i;
char *ptr;
ptr = strstr(unos, trazena_zamjena);
printf("pointer : %d %p", ptr, ptr);
strncpy(ptr, zamjena, l);
printf("%s\n", unos);
}
【问题讨论】:
-
如果你想读一整行,不要使用
scanf使用复杂的格式字符串,而是使用fgets。 -
scanf("%[^\n]%*c", unos, &c);对我来说似乎是错误的 -
@Joachim Pileborg 输入的代码工作正常,进行更改的那个工作不正常。我们还没有在课堂上使用 fgets,所以我们不能使用它。
-
@AntonioGvardijan 所以你不能使用
fgets(?!)。 -
您正在用
strncpy覆盖字符串,因此您的程序的行为是正确的。如果您想插入 个字符,那么您必须通过进一步移动字符串的末尾来插入它们。拿一张纸,在替换前后画出unos缓冲区的内容。