2013-05-28 19 views
0

我在这个程序的输出中遇到了一些麻烦。我需要在一行上打印动词,如果没有动词,我需要打印一个单独的语句。例如。在C中使用printf格式化二进制搜索的输出?

"talk and walk"应打印"The verbs are: talk walk"

"hello there"应打印"There are no verbs"

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int binary_search(char *list_of_words[], int size, char *target){ 
    int bottom= 0; 
    int mid; 
    int top = size - 1; 
    int found = 0; 

    while(bottom <= top && !found){ 
     mid = (bottom + top)/2; 
     if (strcmp(list_of_words[mid], target) == 0){ 
      //printf("%s found at location %d.\n", target, mid+1); 
      found = 1; 
     } else if (strcmp(list_of_words[mid], target) > 0){ 
      top = mid - 1; 
     } else if (strcmp(list_of_words[mid], target) < 0){ 
      bottom = mid + 1; 
     } 
    } 
    if (found == 1) 
     return mid; 
    else 
     return -1; 
} 

int main(int argc, char* argv[]){ 
    char *input = strtok(argv[1], " \"\n"); 
    char *verbs[5] = { "do", "make", "take", "talk", "walk" }; 
    int position; 
    int check = 0; 
    while (input != NULL) { 
     //printf("%s\n", input); 
     position = binary_search(verbs, 5, input); 
     if (position != -1) 
      printf("The verbs are: %s\n", verbs[position]); 
      check = 1; 
     input = strtok(NULL, " "); 
    } 
    if (check == 0){ 
     printf("There are no verbs\n"); 
    } 
    return 0; 
} 

任何想法?

+1

如何使用二分查找搜索字符串中的单词?二进制搜索需要对字段进行排序。 – Dipto

+1

而不是打印'printf(“动词是:%s \ n”,动词[position]);',将'verbs [position]'存储到数组中并在循环后打印。 – Dipto

回答

4

这似乎是工作的罚款,但你需要在

if (position != -1) { 
     printf("The verbs are: %s\n", verbs[position]); 
     check = 1; 
    } 

加括号周围

if (position != -1) 
     printf("The verbs are: %s\n", verbs[position]); 
     check = 1; 

像否则检查总是在循环设置1。

如果你不想重复“的动词有:”,添加一个检查为

if (position != -1) { 
     if (first) { 
      printf("The verbs are:"); 
      first = 0; 
      check = 1; 
     } 
     printf(" %s", verbs[position]); 

    } 
1
int main(int argc, char* argv[]){ 
    char *input = strtok(argv[1], " \"\n"); 
    char *verbs[5] = { "do", "make", "take", "talk", "walk" }; 
    char match[5] = {0}; 
    int position; 
    int check = 0; 
    while (input != NULL) { 
     //printf("%s\n", input); 
     position = binary_search(verbs, 5, input); 
     if (position != -1){ 
      //printf("The verbs are: %s\n", verbs[position]); 
      match[position]=1;//match[position] = check = 1; 
      check = 1; 
     } 
     input = strtok(NULL, " "); 
    } 
    if (check == 0){ 
     printf("There are no verbs\n"); 
    } else { 
     int i; 
     printf("The verbs are: "); 
     for(i=0;i<5;++i) 
      if(match[i]) 
       printf("%s ", verbs[i]); 
     printf("\n"); 
    } 
    return 0; 
} 
0

如果你更感兴趣的只是具有搜索完成,而不是实施它自己(即假设“执行搜索”不是你的实际任务),你应该使用标准库的鲜为人知的英雄bsearch()

请注意,这需要输入数据(您正在搜索的数组)进行排序,但您似乎是因为您已经在进行二分查找。