C 测试字符串中的第一个字符,给出分段错误
我试图给我的程序一个命令行参数,去掉第一个字符并将剩余的字符串转换为int。但是当我使用C 测试字符串中的第一个字符,给出分段错误,c,c11,C,C11,我试图给我的程序一个命令行参数,去掉第一个字符并将剩余的字符串转换为int。但是当我使用if(argv[I][0]=='w')进行测试时,我遇到了一个分段错误 #包括 #包括 #包括 #包括 #包括 #包括 /*如果此标志为非零,则不要立即处理信号*/ 易失性信号原子信号待定; /*如果信号到达且未处理,则该值为非零*/ 易失性sig_原子延迟信号; 无效的 赫芬德勒(内部信号) { 中频(延时信号) 信号_挂起=信号; 其他的 出口(0); } int 主(内部argc,字符**argv)
if(argv[I][0]=='w')
进行测试时,我遇到了一个分段错误
#包括
#包括
#包括
#包括
#包括
#包括
/*如果此标志为非零,则不要立即处理信号*/
易失性信号原子信号待定;
/*如果信号到达且未处理,则该值为非零*/
易失性sig_原子延迟信号;
无效的
赫芬德勒(内部信号)
{
中频(延时信号)
信号_挂起=信号;
其他的
出口(0);
}
int
主(内部argc,字符**argv)
{
信号机(信号机,赫芬德勒);
int i;
int wait=0;
字符*args[argc+3];
args[0]=“mypy.py”;
对于(i=0;i我高度怀疑问题是否存在,这
fopen(strcat(getenv("HOME"), "/mypy.py"), "r");
另一方面,这是非常非常错误的
标准禁止修改由getenv()
1返回的指针,相反,您应该使用临时缓冲区,这样就可以了
FILE *file;
char path[PATH_MAX]; // Include <limits.h>
int result;
const char *home;
home = getenv("HOME");
if (home == NULL)
return EXIT_FAILURE; // Problem, `HOME' env variable not found?
result = snprintf(path, sizeof(path), "%s/mypy.py", home);
if ((result < 0) || (result >= (ssize_t) sizeof(path))
return EXIT_FAILURE' // Very unlikely to happen, BUT CHECK PLEASE.
file = fopen(path, "r")
if (file == NULL) // Please always check ...
return EXIT_FAILURE;
文件*FILE;
字符路径[path_MAX];//包括
int结果;
康斯特查尔家;
主页=getenv(“主页”);
if(home==NULL)
返回EXIT_FAILURE;//问题,未找到'HOME'环境变量?
结果=snprintf(路径,sizeof(路径),%s/mypy.py”,home);
如果((结果<0)| |(结果>=(ssize_t)sizeof(路径))
return EXIT_FAILURE'//不太可能发生,请检查。
file=fopen(路径“r”)
如果(file==NULL)//请始终检查。。。
返回退出失败;
这可能会导致未定义的行为,这意味着您不能期望给定的行为,因此您不能期望程序的其余部分正常工作
1超出解释该问题的标准
7.22.4.6getenv
功能
getenv
函数返回一个指向与匹配列表成员关联的字符串的指针。指向的字符串不能被程序修改,但可能会被后续对getenv函数的调用覆盖。如果找不到指定的名称,则返回空指针
引用自C11标准草案N1570,我突出显示了粗体部分,以清楚说明不能修改指针的位置。发布的代码缺少以下语句:#include
,这是strtol()
和memmove()
和strlen()
和strcat()所需的
函数。发布的代码缺少以下语句:#include
,这是exit()
和getenv()
函数所需的语句args[]数组需要将最后一个条目设为空指针。建议:在args[argc+3]
之后插入:for(i=0;i<(argc+3);i++{args[i]=NULL;}
so将自动在args[]中的char*条目数组末尾有一个空条目
建议:替换两行:`memmove(argv[i],&argv[i][1],strlen(argv[i]);wait=strtol(argv[i],NULL,10);`with the line:wait=strtol(&argv[i][1],NULL,10);
对于此行:args[0]=“mypy;
要正常工作,需要是指向静态存储的指针,而不是只读内存。建议:static char*pgmName[]=“mypy.py”;args[0]=pgmName;
调用系统函数时:fopen()
,始终检查(!=NULL)返回值以确保操作成功。
fopen(strcat(getenv("HOME"), "/mypy.py"), "r");
FILE *file;
char path[PATH_MAX]; // Include <limits.h>
int result;
const char *home;
home = getenv("HOME");
if (home == NULL)
return EXIT_FAILURE; // Problem, `HOME' env variable not found?
result = snprintf(path, sizeof(path), "%s/mypy.py", home);
if ((result < 0) || (result >= (ssize_t) sizeof(path))
return EXIT_FAILURE' // Very unlikely to happen, BUT CHECK PLEASE.
file = fopen(path, "r")
if (file == NULL) // Please always check ...
return EXIT_FAILURE;