Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在包含一些空字符串的已排序字符串数组中查找字符串_C_Arrays_String - Fatal编程技术网

C 在包含一些空字符串的已排序字符串数组中查找字符串

C 在包含一些空字符串的已排序字符串数组中查找字符串,c,arrays,string,C,Arrays,String,字符串数组是按排序顺序给出的,但它之间可以有任意数量的空字符串。我需要在字符串数组中搜索一个字符串。如果找到字符串,则返回该字符串的索引,否则返回-1 我使用strcmp()编写了以下代码,它只适用于不带空字符串的字符串数组。如何将其扩展到同样适用于具有空字符串的数组 #include<stdio.h> #include<stdlib.h> #include<string.h> int search(char *arr[], char *strtofin

字符串数组是按排序顺序给出的,但它之间可以有任意数量的空字符串。我需要在字符串数组中搜索一个字符串。如果找到字符串,则返回该字符串的索引,否则返回-1

我使用strcmp()编写了以下代码,它只适用于不带空字符串的字符串数组。如何将其扩展到同样适用于具有空字符串的数组

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

int search(char *arr[], char *strtofind, int l, int r)
{
    int mid , val;
    if(l <= r)
    {
        mid = (l+r)/2;
        val = strcmp(strtofind, arr[mid]);
        if(val == 0)
            return mid;
        else if(val > 0)
        {
            return search(arr, strtofind,mid+1,r);
        }
        else
        {
            return search(arr, strtofind, l, mid-1);
        }
    }
    return -1;
}

int main(int argc, char** argv) 
{

    int idx;
    //char *arr[] = {"STR1", "STR2","STR3","STR4","STR5","STR6","STR7"}; // WORKS HERE
    char *arr[] = {"STR1", "STR2","STR3",NULL,"STR4",NULL,"STR5"};  // NOT WORKS HERE

    idx = search(arr, "STR4", 0, 6);
    printf("Found at = %d\n", idx);

    printf("Will is Everything.");
    return (EXIT_SUCCESS);
}
#包括
#包括
#包括
整数搜索(char*arr[],char*strofind,intl,intr)
{
int mid,val;
if(l0)
{
返回搜索(arr、STROFIND、mid+1、r);
}
其他的
{
返回搜索(arr、STROFIND、l、mid-1);
}
}
返回-1;
}
int main(int argc,字符**argv)
{
int-idx;
//char*arr[]={“STR1”、“STR2”、“STR3”、“STR4”、“STR5”、“STR6”、“STR7”};//在这里工作
char*arr[]={“STR1”、“STR2”、“STR3”、NULL、“STR4”、NULL、“STR5”};//在这里不起作用
idx=搜索(arr,“STR4”,0,6);
printf(“位于=%d\n”,idx);
printf(“意志就是一切”);
返回(退出成功);
}

类似的内容将跳过空值。一旦找到空值,它就会求助于线性搜索,但我想不出更好的方法

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

int search(char arr[][20], char *strtofind, int l, int r)
{
    int mid , val, down = 1, start;
    if(l <= r)
    {
        mid = (l+r)/2;
        start = mid;
        while(0 == arr[mid])
        {
            if(down)
            {
                if(mid >= l)
                {
                    mid--;
                }
                else
                {
                    down = 0;
                    mid = start;
                }
            }
            else
            {
                if(mid <= r)
                {
                    mid++;
                }
                else
                {
                    return -1;
                }
            }
        }
        val = strcmp(strtofind, arr[mid]);
        if(val == 0)
            return mid;
        else if(val > 0)
        {
            return search(arr, strtofind,mid+1,r);
        }
        else
        {
            return search(arr, strtofind, l, mid-1);
        }
    }
    return -1;
}

int main(int argc, char** argv)
{

    int idx;
    char arr[][20] = {"STR1", "STR2","STR3","STR4"};

    int num = sizeof(arr)/sizeof(arr[0]);
    idx = search(arr, "STR2", 0, num-1);
    if(-1 != idx)
    {
        printf("Found at = %d\n", idx);
    }
    else
    {
        printf("Not found");
    }
    return (EXIT_SUCCESS);
}
#包括
#包括
#包括
整数搜索(char arr[][20],char*strofind,intl,intr)
{
int mid,val,down=1,开始;
如果(l=l)
{
中--;
}
其他的
{
向下=0;
mid=开始;
}
}
其他的
{
如果(中间0)
{
返回搜索(arr、STROFIND、mid+1、r);
}
其他的
{
返回搜索(arr、STROFIND、l、mid-1);
}
}
返回-1;
}
int main(int argc,字符**argv)
{
int-idx;
字符arr[][20]={“STR1”、“STR2”、“STR3”、“STR4”};
int num=sizeof(arr)/sizeof(arr[0]);
idx=搜索(arr,“STR2”,0,num-1);
如果(-1!=idx)
{
printf(“位于=%d\n”,idx);
}
其他的
{
printf(“未找到”);
}
返回(退出成功);
}

执行strcmp()时,请检查是否为NULL。如果为空,则选择该索引-1。它将起作用。

更改比较代码。
arr[mid]
中的
NULL
本质上是“跳过”此元素,因此比较需要线性搜索到下一个或前一个元素

为了防止最坏的情况真正弄乱代码,请确保对列表的两部分的后续搜索不会重新扫描一组关于
mid
NULL
元素。注意列表两端的
NULL

最坏的情况是
O(n*n)
,它与大量
NULL
一起出现。否则,
O(n*ln2(n))
如果
NULL
很少,则可以预期性能

此外,不需要递归调用。见评论

int search(const char *arr[], const char *strtofind, int l, int r)
  while (l <= r) {
    int mid = (l+r)/2;
    int right_min = mid + 1;
    while (arr[mid] == NULL) {
      // If entire left side and mid are NULL ...
      if (mid == 0) {
        return search(arr, strtofind, right_min, r);
        // or { l = right_min; continue; }
      }
      mid--;
    }
    int cmp = strcmp(strtofind, arr[mid]);
    if (cmp == 0) {
      return mid;
    }
    if(val > 0) {
      return search(arr, strtofind, right_min, r);
      // or { l = right_min; continue; }
    }
    int left_max = mid - 1;
    return search(arr, strtofind, l, left_max);
    // or { r = left_max; }
  }
  return -1;
}
int搜索(常量字符*arr[],常量字符*strofind,int l,int r)
while(l0){
返回搜索(arr、strofind、right\u min、r);
//或{l=right_min;continue;}
}
int left_max=mid-1;
返回搜索(arr、strofind、l、left_max);
//或{r=left_max;}
}
返回-1;
}
建议:使用
const


如果所有
NULL
arr[]
位于一端,则存在一种有效的方法
O(n*ln2(n))

您必须检查
arr[mid]!=空
在使用strcmp之前@esskar:好的,如果它为空,我应该如何继续
如果(arr[0][mid]==NULL)返回-1二进制搜索对已排序的数据有效。如果
arr[index]
为空,那么我们现在应该在数组的左侧还是右侧进行搜索?如果数组中的随机位置存在空值,则无法决定如何继续。所以你必须使用线性搜索。我肯定看到了与其他人不同的东西。我仍然想知道如何在数组数组中存储空指针,数组的每个元素都是
char[20]
。这是一个
char*arr[]={…}这是有道理的。如文所述,这一点也不重要。