C编程将char数组传递给函数

时间:2016-04-11 20:09:46

标签: c

我正在使用一个函数来解析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个字符。

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);
}