strstr == NULL不起作用,

时间:2014-11-08 19:58:12

标签: c

#include <stdio.h>
#include <string.h>
#define N 5

char username[N+3][20]={"ana","sofia","maria","isabel","joao","hugo","francisco","pedro"};
char str[20];

read_username()
{
    printf("Insert your username: ");
    gets(str);
}

void searchusername(int n)
{
    int i;
    for(i=0;i<=n;i++)
    {
        if(strstr(username[i], str) != NULL)
            printf("username exists")
    }
}

int main()
{
    read_username();
    searchusername(8);
} 

我有代码来检查用户名是否存在,但我似乎无法转过身,所以我只在用户名不存在时才获得printf,不使用NULL的任何其他方式也没关系,ty。

2 个答案:

答案 0 :(得分:0)

您的比较失败是因为&#39; \ n&#39;字符。

使用getsfgets时,您应该修改输入。

你可以使用这样的功能:

#include <ctype.h> //for isspace
char* trim(char *input_string)
{
  int i=0;
  char *retVal = input_string;
  i = strlen(input_string)-1;
  while( i>=0 && isspace(input_string[i]) ){
      input_string[i] = 0;
      i--;
  }
  i=0;
  while(*retVal && isspace(retVal[0]) ){
    retVal ++;
  }
  return retVal;
}

答案 1 :(得分:0)

一个问题是您没有避免使用gets()缓冲区溢出。我必须假设您输入的是不超过19个字符的短用户名。如果你没有考虑到它,任何更长的时间都会引起问题。

更重要的是,您没有正确比较用户名。您不应该为此目的使用strstr()。它在另一个字符串中搜索子字符串,它不比较字符串。例如,如果您输入ia,则strstr()将与sofiamaria匹配,这两者都是用户名查找的错误结果。使用strcmp()进行比较。

尝试更像这样的东西:

#include <stdio.h>
#include <string.h>
#define N 8

char* username[N] = {"ana", "sofia", "maria", "isabel", "joao", "hugo", "francisco", "pedro"};
char str[20] = {0};

void read_username()
{
    printf("Insert your username: ");
    if (fgets(str, 20, stdin))
    {
        int len = strlen(str);
        if ((len > 0) && (str[len-1] == '\n'))
            str[len-1] = '\0';
    } 
}

void searchusername()
{
    for(int i = 0; i < N ; i++)
    {
        if (strcmp(username[i], str) == 0)
        {
            printf("username exists");
            return;
        }
    }
    printf("username does not exist");
}

int main()
{
    read_username();
    searchusername();
}