首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Argc/Argv C问题

Argc/Argv C问题
EN

Stack Overflow用户
提问于 2010-05-08 05:11:18
回答 6查看 2.2K关注 0票数 1

如果我有以下代码:

代码语言:javascript
复制
main(int argc, char *argv[]){
 char serveradd[20];
 strcpy(serveradd, argv[1]);
 int port = atoi(argv[2]);
 printf("%s %d \n", serveradd, port);

打印命令行的前两个参数。但是,如果我这样做:

代码语言:javascript
复制
 char serveradd[20];
 strcpy(serveradd, argv[1]);
 int port = atoi(argv[2]);
 char versionnum[1]; 
 strcpy(versionnum, argv[3]);
 printf("%s %d %s \n", serveradd, port, versionnum);`

第一个参数(serveradd)不会打印到屏幕上,也不会存储...为什么会发生这种情况?我如何修复它?谢谢!

EN

回答 6

Stack Overflow用户

发布于 2010-05-08 05:14:49

代码语言:javascript
复制
char versionnum[1];  
strcpy(versionnum, argv[3]); 

胡乱猜测,但您正在用这些行打破堆栈。使versionnum更大;目前,它只能安全地保存空字符串。

票数 10
EN

Stack Overflow用户

发布于 2010-05-08 05:17:35

你可能是在用核弹破坏记忆

代码语言:javascript
复制
char versionnum[1]; 
strcpy(versionnum, argv[3]);

假设任何非空的、以null结尾的字符串的长度都将大于1个字符。

切勿直接使用strcpy();而应使用strncpy() (请注意-1以保留空终止符的空间):

代码语言:javascript
复制
char serveradd[20] = { 0 };
strncpy(serveradd, argv[1], sizeof(serveradd) - 1);
int port = atoi(argv[2]);
char versionnum[2] = { 0 }; 
strcpy(versionnum, argv[3], sizeof(versionnum) - 1);
printf("%s %d %s \n", serveradd, port, versionnum);
票数 3
EN

Stack Overflow用户

发布于 2010-05-08 05:15:21

使用strcpy而不使用strlen测试要复制的字符串的长度,以确保它适合目标缓冲区,这是一个非常糟糕的主意。您应该使用strncpy,它是经过长度检查的,不会使目标缓冲区溢出。

不能将字符串存储在长度为1的字符数组中,因为null终止符只接受一个字符,所以您只能存储null字符。几乎可以肯定的是,您的缓冲区正在溢出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2791717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档