C linux在windows上的分段错误

C linux在windows上的分段错误,c,linux,gcc,segmentation-fault,C,Linux,Gcc,Segmentation Fault,这个程序的目标是扫描一个填充了数字和空格的字符串,并将每个数字插入一个数组。然后,数组中的每个数字都被发送到checkPowerOfTwo函数,该函数确定发送的数字是否为2的幂,并打印计算结果 当我在windows上运行这个程序时,一切都正常。在Linux上运行会导致分段错误 我正在Linux服务器上编译代码,其中包含:gcc-std=c99-Wall-pedantic errors-Werror-DNDEBUG main.c-o mtm_tot。它成功编译,没有错误或警告。当我尝试运行测试仪时

这个程序的目标是扫描一个填充了数字和空格的字符串,并将每个数字插入一个数组。然后,数组中的每个数字都被发送到checkPowerOfTwo函数,该函数确定发送的数字是否为2的幂,并打印计算结果

当我在windows上运行这个程序时,一切都正常。在Linux上运行会导致分段错误

我正在Linux服务器上编译代码,其中包含:gcc-std=c99-Wall-pedantic errors-Werror-DNDEBUG main.c-o mtm_tot。它成功编译,没有错误或警告。当我尝试运行测试仪时,问题出现了:./mtm_tottmpout。按此行上的enter键后,分段故障上升

守则:

包括 包括 包括 int checkPowerOfTwoint x; int main { 整数表达式,大小,和=0,*个数字; 字符项,*str=NULL,*token; 输入的打印机打印机大小:\n; 如果扫描频率%d%c,&size,&term!=2 | | term!='\n'{ PrintFin有效大小\n; 返回0;
}如果大小您的程序逻辑错误:

  for (int i = 0; i < size; i++) {
    sscanf(token, "%d", &numbers[i]);
    token = strtok(NULL, " ");

    // token may become NULL here
    // and sscanf will segfault right after
  }

不过,可能还有其他问题。

您的程序逻辑错误:

  for (int i = 0; i < size; i++) {
    sscanf(token, "%d", &numbers[i]);
    token = strtok(NULL, " ");

    // token may become NULL here
    // and sscanf will segfault right after
  }
但是,可能还有其他问题。

输入文件test1.in如问题所示,指定大小为8,并提供9个数字

你的代码

        while(token!=NULL){
            for(int i=0;i<size;i++){
                //printf("token is %s\n",token);
                //numbers[i]=token;
                sscanf(token,"%d",&numbers[i]);
                //printf("Inserting %s to the array\n ",numbers[i]);
                token=strtok(NULL," ");
            }
        }
当然,如果没有足够的值,循环后面的代码必须处理循环以i 编辑:补充澄清如下

注意:scanf的错误检查不完整。如果无法转换整数,它将返回0,但是如果转换了整数并且后面有任何内容,它也将返回1,例如,对于123abc,它将转换123并返回1。要检查数字后面可能有什么内容,可以添加%c转换,如果返回值为2 c检查转换后的字符。“\n”或“\r”在这里可以

我更喜欢在循环中使用strtol来解析str中的数字

顺便说一句:str分配的大小计算是错误的。sizeof int是许多系统上int值的内部二进制表示的大小,它是4 4字节=32位。它与数字的字符串表示需要多少字符无关。有效数字-2147483648需要11个字符

如果您将剩余数据移到开头,并在PASS一个数字后追加新数据,直到读取终止换行符,则可以使用对整行来说太小但足以容纳超过有效数字的缓冲区str。

对于输入文件test1.in,如问题所示,您指定大小为8,并提供9个数字卢比

你的代码

        while(token!=NULL){
            for(int i=0;i<size;i++){
                //printf("token is %s\n",token);
                //numbers[i]=token;
                sscanf(token,"%d",&numbers[i]);
                //printf("Inserting %s to the array\n ",numbers[i]);
                token=strtok(NULL," ");
            }
        }
当然,如果没有足够的值,循环后面的代码必须处理循环以i 编辑:补充澄清如下

注意:scanf的错误检查不完整。如果无法转换整数,它将返回0,但是如果转换了整数并且后面有任何内容,它也将返回1,例如,对于123abc,它将转换123并返回1。要检查数字后面可能有什么内容,可以添加%c转换,如果返回值为2 c检查转换后的字符。“\n”或“\r”在这里可以

我更喜欢在循环中使用strtol来解析str中的数字

顺便说一句:str分配的大小计算是错误的。sizeof int是许多系统上int值的内部二进制表示的大小,它是4 4字节=32位。它与数字的字符串表示需要多少字符无关。有效数字-2147483648需要11个字符


如果你把剩余的数据移到开头,在一个数字之后加上新的数据,直到你读到了终止的新行,你可以使用一个太小而不能超过整个行的缓冲区STR。

你的程序在分割错误之前提供任何输出吗?我也会考虑打印。您的错误将返回到stderr而不是stdout。由于大小和数字未初始化,因此,如果大小无效,则在尝试检查main底部的二次幂时,将取消对数字中的空指针的引用。数字的malloc永远不会执行。现在是学习如何使用调试器的好时机。顺便说一句,sizeofint没有任何问题请不要读取字符串和扫描整数。sizeofint*size+1+…毫无意义。您解析输入的方法过于复杂,完全不需要为了读取一组数字而进行这种长度的分析。循环中的scanf%d和&num可以很好地工作。如果str是字符指针,则str=char*mallocsizeofint*size+1+s行IZE-1*siZeFoChar;应该引起所有的警报在你的头脑中消失:你的程序在分割错误之前提供任何输出吗?我也会考虑把你的错误打印到STDRR而不是STDUT。
大小和数字未初始化,如果大小无效,则在尝试检查main底部的二次幂时,将取消对数字中的空指针的引用。数字的malloc永远不会执行。现在是学习如何使用调试器的好时机。顺便说一下,sizeofint与读取字符串和扫描整数无关。SizeFint*大小+1+。。。毫无意义。您解析输入的方法过于复杂,完全没有必要为了读取一组数字而进行如此长的分析。循环中的scanf%d,&num将非常好地工作。假定str是一个char指针,则str=char*mallocsizeofint*size+1+size-1*sizeofchar;应该会在你的头脑中引起各种各样的警报:这修复了分割错误。只要令牌内有非整数类型,您编写的sscanf行就应该为False?很好地组合了while令牌!=NULL{和forint i=0;i@eliranT请参阅我的澄清添加到修复分段错误的答案中。每当令牌内有非整数类型时,您编写的sscanf行应为False?很好地组合了while令牌!=NULL{和forint i=0;i@eliranT见我的澄清添加到答案中