2014-11-08 74 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