我有一个练习说:
编写一个程序,该程序从键盘读取最多 15 个字符的关键字和最多 n 行的文本(其中 n 是一个常数值)。程序必须从文本中删除那些包含关键字的行并在屏幕上打印“修改过的”文本。
我或多或少知道如何按行保存关键字和文本。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 4 //Este es el nº máximo de líneas
int main()
{
int i;
char clave[15];
char linea[20];
char *texto[MAX]; //array dinámico para el texto
printf("Introduce la palabra clave\n");
gets(clave);
for(i=0; i<MAX; i++)
texto[i]=NULL; //Inicializo a NULL
printf("Texto original\n=============\n");
for(i=0; i<MAX; i++)
{
printf("Introduce la %dº linea:\n",i);
gets(linea);//leo las lineas del texto
if(strstr(linea,clave)==NULL)
{
texto[i]=(char*) malloc(strlen(linea)+1);//guardo bloque
strcpy(texto[i],linea);//le adjudico las lineas al texto
}
}
从这里我卡住了,我如何比较关键字并在文本行中识别它以消除它,并将修改后的文本再次打印到屏幕上?
您需要知道要丢弃哪些行,并
texto
仅将不包含关键字的行添加到数组中。我对您的代码所做的第一个更改是装饰性的:
我已修改
i
by,i+1
以便您不在输出中显示文本0º
。为了解决您的问题,我定义了变量,每次向数组中添加一行时
j
,我都会初始化并递增该变量。0
texto
稍后,在
if
比较键是否存在于输入的行中的内部,我将保留的缓冲区分配给文本行j
我复制其中输入的行
texto[j]
并在复制完成后增加值j
。在代码的末尾,我打印了带有添加行的数组:
注意事项
gets
很危险,很容易得到一个Buffer Overflow,应该改成fgets(str, 19, stdin);
.texto
,这不是必需的。我把完整的代码:
好吧,您应该将每一行与键进行比较,并使用 strstr 检查它是否返回值,如果不是,则该行将不包含键。我给你一个例子:
更多信息