C 测试字符串中的第一个字符,给出分段错误

C 测试字符串中的第一个字符,给出分段错误,c,c11,C,C11,我试图给我的程序一个命令行参数,去掉第一个字符并将剩余的字符串转换为int。但是当我使用if(argv[I][0]=='w')进行测试时,我遇到了一个分段错误 #包括 #包括 #包括 #包括 #包括 #包括 /*如果此标志为非零,则不要立即处理信号*/ 易失性信号原子信号待定; /*如果信号到达且未处理,则该值为非零*/ 易失性sig_原子延迟信号; 无效的 赫芬德勒(内部信号) { 中频(延时信号) 信号_挂起=信号; 其他的 出口(0); } int 主(内部argc,字符**argv)

我试图给我的程序一个命令行参数,去掉第一个字符并将剩余的字符串转换为int。但是当我使用
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.6
getenv
功能

  • 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;