我正在使用一个函数来解析userID、paswd以及进行一些错误检查。该函数从我的main()函数中调用... 但是,当执行时,只有我的UserID和Pswd的前4个字符成功提取。我刚开始学习C编程,来自C#,不确定我错在哪里。这应该相当容易,有人可以指点我正确的方向吗?
static void func1(int argc, char *argv[], char *UserID[30], char *Psw[30])
{
strncpy(UserID, argv[1], sizeof(UserID));
strncpy(Psw, argv[2], sizeof(Psw));
}
int main(int argc, char *argv[])
{
char UserID[30];
char Psw[30];
func1(argc, argv, UserID, Psw);
}
此外,只是想指出,如果我不使用外部函数,而将所有代码放在我的主函数中,那么它就可以工作。
编辑:找到了问题所在。
static void func1(int argc, char *argv[], char *UserID, char *Psw)
{
strncpy(UserID, argv[1], UserIDMaxSize);
strncpy(Psw, argv[2], PswMaxSize);
}
int main(int argc, char *argv[])
{
char UserID[UserIDMaxSize + 1]; /* max val defined in a header file */
char Psw[PswMaxSize + 1]; /* max val defined in a header file */
func1(argc, argv, UserID, Psw);
}
sizeof并没有像我预期的那样起作用...它读取了我的指针大小,而默认情况下始终为4个字符。
strcpy()
或strncpy()
等函数的习惯。虽然后者通常被标记为“安全”,但其使用仍有两个主要缺陷:1.它需要字符串长度的上限,2.由于缺少终止符可能会触发缓冲区溢出。相反,请使用分配函数,如getline()
、strdup()
和asprintf()
。 - cmaster - reinstate monica