在字符串数组中搜索字符串

时间:2019-03-08 10:45:52

标签: c pointers

我写了一些代码来查找给定字符串在字符串数组中的位置。 问题是-它没有给出位置。它给了其他东西。

我理解问题可能与所涉及的指针之间的差异有关,以前的版本致力于查找单词中字母的位置,效果很好。 经过大量尝试找出错误所在后,我向您寻求帮助。 请告诉我应该怎么做。

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


int what (char * token);

main()
{
    int i=0;
    char  string[]="jsr";
    char *token;
    token=&string[0];
    i=what(token);
    printf(" location of input is %d \n", i);
    return 0;

}   

int what (char * token)
{
    int i=1;
    char *typtbl[]={"mov",
        "cmp",
        "add",
        "sub",
        "not",
        "clr",
        "lea",

    };  

    char * ptr;

    ptr=(char *)typtbl;
    while (!(strcmp(ptr,token)==0))
    {
        ptr=(char *)(typtbl+i);
        i++;
    }   
    return i;
} 

3 个答案:

答案 0 :(得分:0)

如前所述,您没有正确设计功能what。如果您的搜索功能遍历所有指针但未找到所需的字符串,它将返回什么值?通常,在那种情况下,返回-1可以指示什么都找不到。同样在这种情况下,使用for循环可能更合适,您可以立即返回索引,而不用遍历所有指针。

int what(char *token)
{
    char *typtbl[] = {
        "mov",
        "cmp",
        "add",
        "sub",
        "not",
        "clr",
        "lea",

    };

    for( size_t i = 0; i < sizeof(typtbl)/sizeof(char*); ++i )
    {
        char *ptr = typtbl[i];
        if(strcmp(ptr, token) == 0)
        {
            return i;  // found something
        } 
    }

    return -1;  // found nothing
}

答案 1 :(得分:0)

更干净的工作版本。

主要问题是以下代码中的(char *)(typtbl+i)替换为typtbl[i]typtbl+i等效于&typtbl[i],因此,如果我的记忆力不错,它是字符串指针的指针,而不是字符串本身的指针

我在数组末尾添加了一个NULL,以便在字符串不存在时可以停止,并返回-1以明确表示未找到。

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

int what(char *token);

int main()
{
    int i = 0;
    char string[] = "jsr";
    i = what(string);
    printf(" location of input is %d \n", i);
    return 0;
}

int what(char *token)
{
    char *typtbl[] = {
        "mov",
        "cmp",
        "add",
        "jsr",
        "not",
        "clr",
        "lea",
        NULL
    };

    int i = 0;
    while(typtbl[i] && !(strcmp(typtbl[i], token) == 0)) {
        ++i;
    }

    if(!typtbl[i])
        i = -1;

    return i;
}

char *token; token=&string[0];没用,因为string == &string[0]

答案 2 :(得分:0)

几件事:

  • 您的主函数缺少其返回类型。
  • 未找到元素时, 中的while循环不会停止。因此,您正在越界阅读。

这应该可以完成无指针算法的工作。

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


int what (char * token);

int main(){
    int i=0;
    char  string[]="jsr";
    char *token;
    token=&string[0];
    i=what(token);
    printf(" location of input is %d \n", i);
    return 0;
}   

int what (char * token){
    unsigned int i=0;
    char *typtbl[]={"mov",
        "cmp",
        "add",
        "sub",
        "not",
        "clr",
        "lea",

    };  
    unsigned int typtbl_x_size = sizeof(typtbl)/sizeof(typtbl[0]);
    char * ptr;

    ptr=typtbl[i];
    while (!(strcmp(ptr,token)==0)){
        i += 1;
        if (i >= typtbl_x_size){
            printf("element not in list\n");
            return -1;
        }
        ptr=typtbl[i];
    }   
    return i;
}