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));
malloc
为 char*
指针分配内存 - 以前是 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
格式标识符的方式完全错误,您没有 free
ing 分配的字符串。
我要补充一点,您正在执行两次 strtok_r
(一次在 if
之外,一次在 if
之内)。两者会return相同的数据,因为str1
是whereisX
的副本
代码可以简化为:
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 似乎是正确的东西并不意味着它们是正确的。这只能说明你走运了。好运不长。
一个简单的问题:
此功能在我的 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));
malloc
为 char*
指针分配内存 - 以前是 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
格式标识符的方式完全错误,您没有 free
ing 分配的字符串。
我要补充一点,您正在执行两次 strtok_r
(一次在 if
之外,一次在 if
之内)。两者会return相同的数据,因为str1
是whereisX
代码可以简化为:
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 似乎是正确的东西并不意味着它们是正确的。这只能说明你走运了。好运不长。