C语言中的系统函数-从CodeBlocks(C)程序创建用户

3

我有个问题,我想做一个程序,用于在电脑上创建帐户。我通过键盘输入用户名和密码来创建新用户。一切都很好,直到我想在代码中编写命令时,我使用了“system(”net user xxx / add“)”,其中xxx==新用户的名称,是的,它可以像这样工作,但我想将xxx更改为从键盘输入的变量。我的意思是,创建新用户的名称由程序用户选择。需要帮助吗?

int main()
{

char login; 



printf("Login of the new user:");

scanf("%s",&login);  

system("net user xxx /add"); 



return 0;  
}

可能是 system(sprintf("net user %s /add", &login)) - shibormot
char login; ... scanf("%s",&login); 只有在非常低的“工作”标准下才能正常运行。实际上,这是未定义的行为,因为scanf()格式%s用于读取以空字符结尾的字符串,但login仅仅是一个单独的char,根本无法容纳字符串。 - Andrew Henle
@shibormot sprintf不会返回所生成的字符串! - Govind Parmar
@GovindParmar 好的,它是C语言。 - shibormot
2个回答

0
你可以使用函数 sprintf 来构建字符串。它的工作方式类似于 printf,但是它将输出生成为字符数组,而不是作为输出到 stdout
例如:
char buffer[100], login[100];
printf("Login of the new user: ");
scanf("%s", login); // notice there is no & operator here
sprintf(buffer, "net user %s /add", login);
system(buffer);

更安全的代码应该使用snprintf,它还将目标字符数组的长度作为参数传递,以确保不会溢出。此外,我会使用fgets而不是scanf,因为出于与snprintf相同的原因,它本质上更安全,比sprintf更安全。

顺便说一句,对于您要做的事情(在Windows系统上添加新用户),有专门设计用于此目的的Windows API,您应该使用它们而不是从system调用net命令,因为这些方法将指示尝试添加用户的成功和失败。我承认,学习Windows API确实非常困难,但如果它让您避免使用system函数,那么这确实是正确的方法。


0
首先,不要对只有1个字节(login)的变量进行scanf。这将导致缓冲区溢出和应用程序崩溃。由于我感觉这是一种作业类型的任务,建议使用字符数组并借助既然我们有snprintf,为什么没有snscanf?。否则,这个答案:C - scanf() vs gets() vs fgets() 将给出如何从stdin中更安全地读取的一些好的方向。
其次,您需要另一个缓冲区来创建net add ...命令。为此,我建议使用snprintf (https://msdn.microsoft.com/en-us/library/2ts7cx93.aspx) 以安全的方式实现所需的结果。

为了不妨碍你的学习,我故意没有在这里发布解决此问题的代码,请随时提出更多问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接