32 位 C 程序不再在 64 位上将 char 转换为 int OS Linux

32bit C program no longer converting char to int on 64 bit OS Linux

一个简单的问题:

此功能在我的 32 位 Linux 上完美运行,然后我得到了 64 位 Linux,现在它不再工作了。在将数据从 Char 转换为 Int 时,我已将其缩小到此函数。它不再这样做了。这就是我现在被困的地方。所有这些函数所做的就是采用像这样的 100x100 格式,然后切掉 x 并保留两边的两个数字,然后将它们更改为 Int。

使用 atoi 现在返回垃圾,因为我在这个 64 位 Linux 上 运行 它。我必须使用什么函数调用才能使其现在仅在 32 位和 64 位 Linux 程序上再次运行?

int findX(char *whereisX, int *rW, int *rH)
{
printf("entering findx dia is %s\n\n", whereisX);
char *tok1, *tok2, *saveptr;
char x = (int) malloc(sizeof(whereisX));

char str1[x];
int bW, bH;

strcpy(str1, whereisX);

tok1 = strtok_r(whereisX, "x", &saveptr);
tok2 = strtok_r(NULL, "x", &saveptr);

if ( tok2 == NULL)
{   printf("found return 1\n");
    return 1;
}
 else
    { printf("returning 0\n");
        tok1 = strtok_r(str1, "x", &saveptr);
        tok2 = strtok_r(NULL, "x", &saveptr);

        printf("tok1 is .. %s and tok2 is %s\n", tok1 , tok2);

    // here is where I am converting it from Char to Int
    // using atoi now gives me back junk 

     // bW = atoi(tok1);
     //    bH = atoi(tok2);


    bW = atoll(tok1);
    bH = atoll(tok2);
        printf("bW is %c and bH is %c\n", bW, bH);
       // printf("string -- bW is %s and bH is %s\n", bW,bH);
    /* assigning the results to the output */
       *rW = bW;
       *rH = bH;
    printf("rW is %s  rH is %s\n", rW  , rH); 
       return 0;
     }
} //end findX

输出是

tok1 is .. 200 and tok2 is 100
// after converting from char to int using atoi
bW is � and bH is d
rW is �  rH is d

你用来分配内存来复制传递的字符串的这些行是无稽之谈。

char x = (int) malloc(sizeof(whereisX));    // does not give the string length
char str1[x];                               // does not allow for terminator
int bW, bH;
strcpy(str1, whereisX);

会更好

char str1[1+strlen(whereisX)];
strcpy(str1, whereisX);

你的早期版本竟然能正常工作真是个奇迹!

编辑

让我们来看看它:

char x = (int) malloc(sizeof(whereisX));

mallocchar* 指针分配内存 - 以前是 4 个字节,现在是 8 个。

(int)malloc将分配的内存地址转换为整数

然后char x =将整数存储在8位中。这与您要复制的字符串的长度无关。

下一步 char str1[x]; 分配一个大小与您要复制的字符串长度完全无关的数组。即使 did 的长度正确,它也需要长一个元素才能使用 nul 终止符。如果它以前有效,那么您最终得到一个足够长的数组真是太幸运了。

但是切换到不同的编译器时出现了这个错误。

所以不要说我没有回答你的问题,请更正你的错误,看看它是否能解决问题。也许会,也许不会:我没有看过第 3 行,看看是否还有其他 howlers

您的代码的正确版本是:

int findX(char *whereisX, int *rW, int *rH)
{
    printf("entering findx dia is %s\n\n", whereisX);
    char *tok1, *tok2, *saveptr;

    char *str1 = (char*)malloc(1 + strlen(whereisX));
    int bW, bH;

    strcpy(str1, whereisX);

    tok1 = strtok_k(whereisX, "x", &saveptr);
    tok2 = strtok_k(NULL, "x", &saveptr);

    if (tok2 == NULL)
    {
        printf("found return 1\n");
        free(str1);
        return 1;
    }
    else
    {
        printf("returning 0\n");
        tok1 = strtok_k(str1, "x", &saveptr);
        tok2 = strtok_k(NULL, "x", &saveptr);

        printf("tok1 is .. %s and tok2 is %s\n", tok1, tok2);

        bW = atoi(tok1);
        bH = atoi(tok2);

        printf("bW is %d and bH is %d\n", bW, bH);
        /* assigning the results to the output */
        *rW = bW;
        *rH = bH;

        printf("rW is %d  rH is %d\n", *rW, *rH);
        printf("tok1 is %s  tok2 is %s\n", tok1, tok2);

        free(str1);
        return 0;
    }
} //end findX

注意区别:您使用 malloc 的方式 完全错误 ,您使用 printf 格式标识符的方式完全错误,您没有 freeing 分配的字符串。

我要补充一点,您正在执行两次 strtok_r(一次在 if 之外,一次在 if 之内)。两者会return相同的数据,因为str1whereisX

的副本

代码可以简化为:

int findX(char *whereisX, int *rW, int *rH)
{
    printf("entering findx dia is %s\n\n", whereisX);
    char *tok1, *tok2, *saveptr;

    int bW, bH;

    tok1 = strtok_k(whereisX, "x", &saveptr);
    tok2 = strtok_k(NULL, "x", &saveptr);

    if (tok2 == NULL)
    {
        printf("found return 1\n");
        return 1;
    }
    else
    {
        printf("returning 0\n");

        printf("tok1 is .. %s and tok2 is %s\n", tok1, tok2);

        bW = atoi(tok1);
        bH = atoi(tok2);
        printf("bW is %d and bH is %d\n", bW, bH);
        // printf("string -- bW is %s and bH is %s\n", bW,bH);
        /* assigning the results to the output */
        *rW = bW;
        *rH = bH;
        printf("rW is %d  rH is %d\n", *rW, *rH);
        printf("tok1 is %s  tok2 is %s\n", tok1, tok2);
        return 0;
    }
} //end findX

用 C 编写的随机程序有时 运行 return 似乎是正确的东西并不意味着它们是正确的。这只能说明你走运了。好运不长。