我有这段代码,它会删除句子中第一次出现的单词:
#include "stdio.h"
#include "string.h"
int delete(char *source, char *word);
void main(void) {
char sentence[500];
char word[30];
printf("Please enter a sentence. Max 499 chars. \n");
fgets(sentence, 500, stdin);
printf("Please enter a word to be deleted from sentence. Max 29 chars. \n");
scanf("%s", word);
delete(sentence, word);
printf("%s", sentence);
}
int delete(char *source, char *word) {
char *p;
char temp[500], temp2[500];
if(!(p = strstr(source, word))) {
printf("Word was not found in the sentence.\n");
return 0;
}
strcpy(temp, source);
temp[p - source] = '\0';
strcpy(temp2, p + strlen(word));
strcat(temp, temp2);
strcpy(source, temp);
return 1;
}
如何修改它以删除给定句子中所有出现的单词?在这种情况下我还可以使用strstr函数吗?
感谢您的帮助!
也可以采取完全不同的方式。
P.S。这可能听起来像是一个家庭作业问题,但它实际上是一个过去的中期问题,我想为我的期中考试做好准备!
作为一个附带问题,如果我使用fgets(word, 30, stdin)
代替scanf("%s", word)
,它就不再起作用,并告诉我在句子中找不到该单词。为什么呢?
答案 0 :(得分:3)
尝试以下
#include <stdio.h>
#include <string.h>
size_t delete( char *source, const char *word )
{
size_t n = strlen( word );
size_t count = 0;
if ( n != 0 )
{
char *p = source;
while ( ( p = strstr( p, word ) ) != NULL )
{
char *t = p;
char *s = p + n;
while ( ( *t++ = *s++ ) );
++count;
}
}
return count;
}
int main( void )
{
char s[] = "abxabyababz";
printf( "%zu\n", delete( s, "ab" ) );
puts( s );
return 0;
}
输出
4
xyz
关于fgets
的问题,它包含字符串中的新行字符。你必须从字符串中删除它。
答案 1 :(得分:1)
如何将其修改为 删除给定句子中所有出现的单词 ?
正如您所建议的那样,有许多方法,并且因为您以完全不同的方式开放......
这是一个不同的想法 :
一个句子使用空格来分隔单词。您可以使用它来帮助解决问题。请考虑使用fgets()
,strtok()
和strcat()
来拆分字符串,并在不使用字符串删除的情况下重新组合它。
0) create line buffer sufficient length to read lines from file
(or pass in line buffer as an argument)
1) use while(fgets(...) to get new line from file
2) create char *buf={0};
3) create char *new_str; (calloc() memory to new_str >= length of line buffer)
4) loop on buf = strtok();, using " \t\n" as the delimiter
Inside loop:
a. if (strcmp(buf, str_to_remove) != 0) //approve next token for concatenation
{ strcat(new_str, buf); strcat(new_str, " ");}//if not str_to_remove,
//concatenate token, and a space
5) free allocated memory
new_str
现在包含没有出现str_to_remove的句子。
这是一个演示 ,使用这套步骤(差不多)
int delete(char *str, char *str_to_remove)
{
char *buf;
char *new_str;
new_str = calloc(strlen(str)+1, sizeof(char));
buf = strtok(str, " \t\n");
while(buf)
{
if(strcmp(buf, str_to_remove) != 0)
{
strcat(new_str, buf);
strcat(new_str, " ");
}
buf = strtok(NULL, " \t\n");
}
printf("%s\n", new_str);
free(new_str);
getchar();
return 0;
}
int main(void)
{
delete("this sentence had a withh bad withh word", "withh");
return 0;
}