strstr函数未返回NULL

时间:2016-07-31 21:47:55

标签: c string ubuntu strstr

我是新来的,这是我的第一个问题。

我已经搜索了这个问题,但没有发现任何此类问题。 所以就这样了。

我正在使用2d字符数组为名称数据库编写基于菜单的程序。以下是我的主要功能。

int main(void)
{
    char name[MAX][25] = { 0 };
    char choice;

    while (1) {
        printf("******************menu****************\n");
        printf("i: input\n");
        printf("p: print\n");
        printf("f: find\n");
        printf("d: delete\n");
        printf("s: sort\n");
        printf("e: edit\n");
        printf("q: quit\n");
        printf("**************************************\n\n");
        printf("Enter your choice: ");
        scanf(" %c", &choice);
        getchar();

        switch (choice) {
            case 'i':
                input(name);
                break;
            case 'p':
                print(name);
                break;
            case 'f':
                find(name);
                break;
            case 'q':
                return 0;
            default:
                printf("Invalid choice\n");
        }
    }
}

输入和打印功能正常,但我在查找功能方面有问题。 在这里。

void find(char (*p)[25])
{
    int i;
    char str[25];

    if (count == 0) {
        printf("Empty database\n");
        return;
    }

    printf("Enter name to search: ");
    fgets(str, 25, stdin);
    str[strlen(str) - 1] = 0; //Removing new line character at the end of string.

    for (i = 0; i < count; i++) {
        if (strstr(p[i], str) != NULL); //Breaking the loop, when first occurence is found among all the names.
        break;
    }

    if (i == count) {

        printf("Not found\n"); // if loop is not terminated by "break" statement,
        // that means strstr returned NULL for all names.
        return;
    }

    printf("Names matching with %s\n", str);

    for (i = 0; i < count; i++) {

        if (strstr(p[i], str) != NULL); // Again looping to print all the matching names.
        puts(p[i]);
    }
}

count是一个全局变量,在输入函数中递增。 strstr函数总是返回true,即使我提供了一些乱码。 我使用的是ubuntu 16.04 gcc 5.3.1

我尝试使用strstr处的断点进行调试,它正确地接收了两个字符串,但总是将指针返回到haystack。

__strstr_sse2 (haystack_start=0x7fffffffdcb0 "Imtiyaz", needle_start=0x7fffffffdc60 "abcd") at ../string/strstr.c:53

53 ../string/strstr.c:没有这样的文件或目录。

干草堆是"Imtiyaz",针是"abcd"

这是它返回的内容。

find (p=0x7fffffffdcb0) at name_data.c:126

我不明白这里出了什么问题,是不是来自我身边?

还有一件事,以前我尝试使用strcasestr(),但是编译器会抛出警告“隐式声明”,尽管我正确地包含了<string.h>

请帮帮我。

编辑:好的朋友,我也会显示输入和打印功能,让人们正确分析我的程序。顺便说一下,这是正常的。

void input(char (*p)[25])
{
    if (count == MAX) {
        printf("Memory full\n");
        return;
    }

    printf("Enter name: ");

    fgets(p[count], 25, stdin);
    p[count][strlen(p[count]) - 1] = 0; //Removing the new line character at the end of string.
    count++;
}

void print(char (*p)[25])
{
    int i;

    if (count == 0) {
        printf("Empty database\n");
        return;
    }

    printf("********************************\n");

    for (i = 0; i < count; i++) {
        printf("%d   %s\n", i + 1, p[i]); //printing names with serial numbers.
    }

    printf("********************************\n");
}

我还没有实现其他功能(比如删除,搜索等),因为你可以看到int switch-case。

2 个答案:

答案 0 :(得分:8)

末尾有一个虚假的;
if (strstr(p[i], str) != NULL); 

因此if语句不执行任何操作,并且始终执行下一个语句break;

find函数中有2次出现此错误。

答案 1 :(得分:1)

.transparent_class { /* IE 8 */ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; /* IE 5-7 */ filter: alpha(opacity=50); /* Netscape */ -moz-opacity: 0.5; /* Safari 1.x */ -khtml-opacity: 0.5; /* Good browsers */ opacity: 0.5; } 是非标准的,只有在使用它的源文件的最顶层执行此操作时才会定义:

.style.opacity
.style.MsFilter
.style.filter.alpha
.style.MozOpacity
.style.KhtmlOpacity

至于为什么.style.MsFilter = "\"progid:DXImageTransform.Microsoft.Alpha(opacity=1)\""; 没有达到你所期望的效果,你将不得不将你的程序煮得更多,看看有什么不对。就目前而言,有大量的代码,包括一些你没有显示的代码(如strcasestr()的递增)。