【发布时间】:2017-07-13 23:50:18
【问题描述】:
我正在使用一个函数来解析用户 ID、密码和一些错误检查。该函数是从我的 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);
}
另外,需要指出的是,如果我不使用外部函数,并且将所有代码都放在我的 main 函数中,那么它就可以工作。
编辑:-
找出问题所在:-
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 个字符。
【问题讨论】:
-
编译器有没有给你任何警告,它们是什么,你为什么忽略它们?
-
把UserId和Psw前面的*去掉就行了
-
请从问题中删除您的解决方案。答案在 Stack Overflow 上的 Answer 框中。
-
帮自己一个忙,甚至不要养成使用
strcpy()或strncpy()之类的功能的习惯。虽然后者通常被标记为“安全”,但它的使用仍然存在两个主要缺陷:1. 它需要字符串长度的上限,以及 2. 它可能由于缺少终止而触发缓冲区溢出。请改用getline()、strdup()和asprintf()等分配函数。 -
@Philo 他说你应该为你的问题添加一个答案(就好像它是其他人的一样)而不是编辑问题;)
标签: c