fgets& strstr似乎不起作用?

时间:2016-12-07 09:10:09

标签: c

这是整个代码,问题出在第25行。如果我用strcpy给出值,代码就可以了。如果我尝试用fgets读取值,则第23行中的strstr不起作用。谢谢你的帮助。

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

typedef struct tk {
    char name[60];
} tk;

int main() {
    tk* array;
    array = (tk*) calloc(1, sizeof(tk));
    int k;
    char c[60], h[60];
    strcpy(array[0].name, "A B");

    void find(char *c, tk *array) {
        for (k = 0; k < strlen(array[0].name); k++) {
            h[k] = tolower(array[0].name[k]);
        }
        printf("%s %s", array[0].name,c);
        if (strstr(h, c) != NULL) printf("1");
    }
    fgets(c, 60, stdin);
    k = 0;
    for (k = 0; (k < strlen(c)); k++) {
        c[k] = tolower(c[k]);
    }
    find(c, array);
    free(array);
    return (0);
}

2 个答案:

答案 0 :(得分:1)

fgets man page

  

fgets从当前流位置读取字符到和   包括第一个换行符,到流的末尾,或   直到读取的字符数等于n - 1,以两者中的任何一个为准   第一

这就是为什么当您使用c而不是strcpy设置fgets时获得匹配。

您可以删除这样的换行符

c [ strcspn(c, "\r\n") ] = 0;

如果没有换行符,则无害。

答案 1 :(得分:0)

fgets之后添加此行。从\n

读取后,您需要删除stdin
fgets(c, 60, stdin);
strtok(c, "\n"); // add this statement

从stdin读取后对c数组进行标记。在此之后应该工作正常。干杯!