我正在使用一个函数来解析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个字符。
答案 0 :(得分:2)
我猜你的指针大小为4 Byte。因此你只读了4个字符。
答案 1 :(得分:1)
TL; DR
sizeof
没有做你期望的事。请尝试使用strlen
。
你只复制了4个字符,因为任何 N 的sizeof(char*[N])
只是指针的大小。在您的平台上,指针必须是4个字节(32位)。
我认为你实际上是指将数组的基地址传递给函数,但在这种情况下你的类型并不完全正确。您的编译器应该警告您这一点。您应该从最近的2种参数类型中删除*
:
static void func1(int argc, char *argv[], char UserID[30], char Psw[30])
那应该摆脱警告,它实际上应该使sizeof
行为正确(因为sizeof(char[30])
是30)。但是,使用sizeof
犯错很容易,因为char*
和char[]
的行为不同...我更喜欢使用strlen
(或{{1相反,这里只是告诉你有多少非空字符。
使用strnlen
而不是strnlen
也会有助于提示您参数类型错误,因为它会抱怨您尝试将sizeof
传递给函数需要char**
。
答案 2 :(得分:1)
将数组大小传递给函数
<a href="path" ></a>
为了确保目标数组的空字符终止,建议static void func1(int argc, char *argv[], char *UserID, size_t UserIDSize,
char *Psw, size_t PswSize)
{
if (argc> 1) strncpy(UserID, argv[1], UserIDSize);
if (argc> 2) strncpy(Psw, argv[2], PswSize);
}
int main(int argc, char *argv[])
{
char UserID[30] = {0};
char Psw[30] = {0};
func1(argc, argv, UserID, sizeof UserID, Psw, sizeof Psw);
}
- &gt; “终止空字符始终附加到结果中。” strncat()
有太多问题,并不总是导致数组为空字符。
strncpy()
[编辑]
更正代码 - 关闭1
答案 3 :(得分:-1)
解决方案
#include <stdio.h>
#include <string.h>
void func1(int argc, char *argv[], char *UserID, char *Psw)
{
strncpy(UserID, argv[1], strlen(argv[1]));
strncpy(Psw, argv[2], strlen(argv[2]));
printf("DATA: %s \n",UserID);
printf("DATA1: %s \n",Psw);
}
int main(int argc, char *argv[])
{
char UserID[30];
char Psw[30];
printf("argv1 %ld \n",strlen(argv[1]));
printf("argv2 %ld \n",strlen(argv[2]));
func1(argc, argv, UserID, Psw);
}