所以在这里:我需要从用户获得两个字符串,string1和string2,然后删除"单词"在string1中,它也存在于string2和print1中。
我可以对它们进行标记,但后来我没有想法/知识,需要帮助:)
int main()
{
char string1[100]; //declaration of array for 1st input
const char *tokens1[100]; //declaration of array of pointers
char *token_ptr1; //pointer var to store tokens
char string2[100]; //declaration of array for 1st input
const char *tokens2[100]; //declaration of array of pointers
char *token_ptr2; //pointer var to store tokens
int i=0;
//input from user:
printf("Enter string1: ");
gets(string1);
printf("\n");
printf("Enter string2: ");
gets(string2);
printf("\n");
//using strtok function to tokenize string1
token_ptr1=strtok(string1," ");
printf("Tokens1: \n"); //loop to store tokens in array of pointers and printing tokens
while (string1!='\0')
{
if (token_ptr1=='\0') { break; }
printf("%s\n",token_ptr1);
tokens1[i]=token_ptr1;
token_ptr1=strtok(NULL, " ");
i++;
}
//string1 is tokenized and stored in tokens1
}
在此之后,我尝试了各种方法来删除常见的单词无效
编辑:同一问题中的另一个问题:
示例INPUT1:这是一个string234
- 示例输入2:234
- 示例输出:这是一个字符串
使用标记化方法字符串" string234"保存在指针数组中,现在如何处理这个程序?使用简单数组检查单个字符?
答案 0 :(得分:0)
天真的方法是对两个字符串进行标记,然后从string1循环遍历每个标记并与string2进行比较。如果令牌匹配,则通过标记来删除令牌。
标记第二个字符串并创建一个数组以标记来自string1的每个标记。 如果找到匹配,则标记token1索引,最后只打印未标记的标记。 我可以使用这样的匹配函数:
int match(int ind1, int ind2){
while(string1[ind1]!='0'){
if (string2[ind2]==string1[ind1]){
ind2++;
ind1++;
}else{
break;
}
}
// Check if string2 also ended at same position
if (string1[ind1]==string2[ind2]) return 1;
return 0;
}
Haven没有测试过,但我认为是对的。 希望能帮助到你!
答案 1 :(得分:0)
我在考虑你不会改变i
,因为它包含令牌的数量。
strstr(str1,str2)
,返回指向str2中指定的整个字符序列的str1中第一个匹配项的指针,如果str1中不存在该序列,则返回空指针。
char * ptr;
for ( j = 0 ; j < i ; j++){
ptr = strstr (string2,tokens1[j]);
if(ptr){
token1[j] = '\0';
}
}
for (j = 0 ; j < i ; j++){
if(strlen(token1[j]) > 0){
puts(token1[j]);
}
}
希望这会有所帮助.. :)
注意:我没有编译它,只是在这里写了代码。而且我在过去的1。5年里远离C编码。在编程竞赛中使用了很多。所以请指出任何错误,让我知道:)。
答案 2 :(得分:0)
首先,如果它完全编译,你会得到一个很好的无限循环。您将常量字符指针string1
与字符进行比较,这是毫无意义的错误。
while (string1 !≃ '0')
应该是
while (token_ptr1 != NULL)
然后你也应该跳过下一行。
如果你不想错过那些,你应该准备好每个字符串中的最后一个单词,然后是换行符而不是空格:
strtok(string1, " \n");
strtok(NULL, " \n");
两个循环都有一个单独的临时tokenx_ptr
是多余的,你可以在两个循环中使用一个。
接下来,您需要跟踪每个字符串中找到的单词数量。您可以在i
或n1
的两个循环之后存储n2
,也可以将最后一个失败的NULL
的{{1}}值存储到数组中。我正在采取第二种方法。
然后,这是一个丑陋的O(n2)双循环问题,用于打印strtok
数组中不存在于tokens1
数组中的标记。
tokens2
答案 3 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int cmp(const void *a, const void *b){
return strcmp(*(const char**)a, *(const char**)b);
}
int main(){
char string1[100];
char *token_ptr1;
char string2[100];
const char *tokens2[100];
char *token_ptr2;
char result[100]={0};
char *wordp, word[100];
const char *delimiter = " \t\n";
int i, len, ndw;//Number of delete words
printf("Enter string1: ");
fgets(string1, sizeof(string1), stdin);//include newline
//printf("\n");
printf("\nEnter string2: ");
fgets(string2, sizeof(string2), stdin);
for(ndw=0, token_ptr2=strtok(string2, delimiter);token_ptr2;token_ptr2=strtok(NULL, delimiter)){
tokens2[ndw++] = token_ptr2;
}
qsort(tokens2, ndw, sizeof(*tokens2), cmp);
token_ptr1 = string1;
token_ptr2 = result;
while(*token_ptr1 != '\0'){
len = strspn(token_ptr1, delimiter);
strncpy(token_ptr2, token_ptr1, len);//delimiter remain.
token_ptr1 += len;
token_ptr2 += len;
len = strcspn(token_ptr1, delimiter);
strncpy(word, token_ptr1, len);
word[len] = '\0';
wordp = word;
if(NULL == bsearch(&wordp, tokens2, ndw, sizeof(*tokens2), cmp)){
strncpy(token_ptr2, token_ptr1, len);
token_ptr2 +=len;
}
token_ptr1 += len;
}
*token_ptr2 = '\0';
printf("%s", result);
return 0;
}