2017-02-10 102 views
0

我问两个简单的用户输入,一个用户和一个密码,然后我将它们插入到一个文本文件中,每个文件后面都有一个分号。分号保存和密码保存,但用户名不能保存一些奇怪的原因。插入到文本文件空白

例如,如果我输入乔密码111222444555它会 显示为;111222444555;代替Joe;111222444555;

代码:

int main() 
{ 
    int Number_Of_Attempts = 3; 
    int result = 0; 
    char userID[32]; 
    printf("Please enter your user id\n"); 

    scanf("%s", &userID); 

    char password[12]; 

    printf("The user has not been found. Please enter your a password\n"); 


    scanf("%s", &password); 


    printf("Username and Password has been saved"); 
    printf("\n"); 

    InsertIntoHash(userID, password); 

    return 0; 
} 


void InsertIntoHash(char *userID, char *hash) 
{ 
    FILE *fp; 
    fp = fopen("HashTable.txt", "a"); 
    fprintf(fp, userID); 
    fprintf(fp,";"); 
    fprintf(fp, hash); 
    fprintf(fp, ";\n"); 
    fclose(fp); 
} 
+0

为什么不'fprintf(fp,“%s;%s; \ n”,userId,hash);'? – John3136

+0

可能出于某种原因,您正在写一些CR(回车)到文件中? “Joe; ...”的文件需要多长时间? – linuxfan

+0

您应该打印两个变量,以便您可以看到提供给InsertIntoHash的内容。这将帮助您找出问题所在。 – hymie

回答

2

您应该在字符串中使用scanf("%31s", userID);来读取用户ID和scanf("%11s", password);作为密码。
我认为导致这个问题的原因是,你声明并定义了主函数后面的InsertIntoHash,而没有在开头声明原型。 因此,代码应该是以下几点:(我测试了它和它的作品)

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

void InsertIntoHash(char *userID, char *hash); 

int main() { 
    int Number_Of_Attempts = 3; 
    int result = 0; 
    char userID[32]; 
    printf("Please enter your user id\n"); 
    scanf("%31s", userID); 
    char password[12]; 
    printf("The user has not been found. Please enter your a password\n"); 
    scanf("%11s", password); 
    printf("Username and Password has been saved"); 
    printf("\n"); 
    InsertIntoHash(userID, password); 
    return 0; 
} 

void InsertIntoHash(char *userID, char *hash) { 
    FILE *fp; 
    fp = fopen("HashTable.txt", "a"); 
    fprintf(fp, userID); 
    fprintf(fp,";"); 
    fprintf(fp, hash); 
    fprintf(fp, ";\n"); 
    fclose(fp); 
} 

我希望我能帮助你! :)

1

变化scanf("%s", &userID);scanf("%s", userID);,因为它已经是其将被传递的阵列作为指针。密码相同。


注意密码的缓冲区太小:密码是12个字符,缓冲区也是这样,因此终止空字符放置在缓冲区之外(导致出现未定义行为,就像您遇到的那样)。

使用"%11s"将读取的长度限制为缓冲区的大小,为终止空字符留出空间。

+0

删除&从scanf函数后,我仍然得到相同的奇怪结果\ – Master

+0

@Master然后分享奇怪的结果。 –

+0

@AmitKumar,它在原始的芽后。 – Master