-3
int get_max_horizantal()
{
    char str[2];
    char strb[2]; //Everything works well unless I put this
    extern char shit[1200];
    int x,number;
    while((3*x+1)<1200)
    {
        if(number%17==0 && number!=0)
        {
            x+=2;
            number=-1;
        }
        str[0]=shit[3*x];
        str[1]=shit[3*x+1];
        int val1=atoi(str);
        printf("%d\n",val1);
        x++;
        number++;
    }
}

好的,所以这是我根本没有得到的东西......整个函数运行良好,但是当我把这个 char strb[2]; printf 不打印任何内容,也没有编译错误或警告...这次我真的需要帮助...提前谢谢。

4

3 回答 3

3

如果要atoi在 char 数组上使用,则必须在末尾放置一个空终止符。向堆栈添加东西会改变行为通常意味着您已经离开了一些内存的尽头。使 str 更大并在末尾添加 null :

char str[3];
str[2] = 0;
于 2013-07-08T11:46:06.650 回答
3

atoi想要一个合适的字符串。您传递给它的不是正确的字符串,因为它不是以 nul 结尾的。这会导致未定义的行为,在您的情况下,这种行为表现为看似无关的改变,使事情工作或不工作。

于 2013-07-08T11:46:12.480 回答
2

atoi(3)函数需要一个以空值结尾的字符串,即一个char包含零字节的数组(通常会终止该字符串)。

str在填充它们之前,您应该给它们至少 3 个字符并将它们归零,使用memset或明确清除最后一个字节:

char str[3];
/* possible alternative:
   memset (str, 0, sizeof(str)); // the compiler will optimize that...
*/
str[0] = shit[3*x];
str[1] = shit[3*x+1];
str[2] = (char)0;

请养成在编译时启用所有警告和调试信息gcc -Wall -g的习惯(例如在 Linux 上编译),并学习如何使用调试器gdb在 Linux 上)。

我确信您的编译器能够警告您x并且number未初始化,您应该修复它:

int x=0, number=0;

根据经验,改进你的源代码直到你的编译器没有给出警告(所有的警告都是由 eg 请求的-Wall,甚至可能-Wextra在 using 时也是如此gcc)。然后使用调试器来调试您的代码:在 Linux 上,您应该熟悉por printsor stepdor或的命令。displaybtbacktracegdb


考虑使用snprintf(3)(但不要使用 deprecated 和 unsafe sprintf)。


了解未定义行为。您的程序可能显然可以正常工作(由于运气不佳)但有问题。

于 2013-07-08T11:48:17.583 回答