2014-11-08 47 views
-2
#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。strstr == NULL不起作用,

+3

'gets'不删除尾部的换行符,所以你的字符串将包含它,因此不匹配任何名字。另外,***不要使用'gets()',因为它是不安全的!***使用'fgets()'代替。并且设计你的代码,因为它看起来很糟糕。 – 2014-11-08 20:00:32

+0

请注意,您的循环在这里从0到8,而您的数组只有索引0 ... 7。 – hyde 2014-11-08 20:02:03

+0

@hyde你实际上是对的,但这是重复的。甚至不是重复的,而是'N + 1' - licate。因此,它应该是复制关闭而不是被回答(这会鼓励OP再次忽略调试器和文档)。 – 2014-11-08 20:05:13

回答

0

的一个问题是,你是不会避免与gets()缓冲区溢出。在这个例子中,我必须假定您输入的用户名不超过19个字符。如果你不考虑它,任何更长的时间都会导致问题。

更重要的是,您没有正确比较用户名。您不应该为此使用strstr()。它搜索另一个字符串内的子字符串,它不会比较字符串。例如,如果您键入iastrstr()将与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(); 
} 
+0

我不认为用修改后的代码回答没有解释任何更改是有用的... – hyde 2014-11-08 20:37:24

+0

谢谢大家,它是我的第一篇文章,所以我为我的代码格式道歉,我理解了大多数Remy Lebeau的代码行,我没有得到是(str [len-1] =='\ n'),这是因为“拖尾换行符”? – 2014-11-08 21:20:00

+0

@FranciscoSilva:是的,它检查是否读入'str'的​​最后一个字符是换行符,如果是,则用空终止符替换它。 – 2014-11-08 23:17:00

0

由于'\ n'字符的原因,您的比较失败。

当使用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; 
} 
+0

'gets'不会将尾随的换行符存储到缓冲区中...... – hyde 2014-11-08 20:33:15

+0

但是'fgets()'可以。 – 2014-11-08 20:33:49

+0

尽管如此,OP确实应该将它们的代码转换为使用'fgets',然后这会很有用。 – hyde 2014-11-08 20:34:25