32位C程序不再在64位操作系统Linux上将char转换为int

一个简单的问题:

这个function在我的32位Linux上完美工作,然后我得到了一个64位的Linux,现在它不再工作。 我已经缩小到这个函数将数据从Char转换为Int。 它不再这样做。 这是我现在卡在哪里。 所有这些function正在做的是采取这样的格式100×100,然后砍掉x,并保持两边的数字,然后改变他们的诠释。

现在使用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]; 指定一个与你将要复制的字符串长度完全无关的数组。 即使你有正确的长度,但需要更长的一个元素才能结束终止符。 如果它以前工作,是纯粹的运气,你结束了足够长的阵列。

但切换到不同的编译器已经显示了这个错误。

所以,而不是说我没有回答你的问题,请纠正你的错误,看看是否解决了这个问题。 也许会,也许不会:我没有看过去的第3行,看看有没有其他的吹嘘者

您的代码的正确版本是:

 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分配的字符串。

我会补充说,你正在做strtok_r两次(一次在ifif )。 这两个将返回相同的数据,因为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编写的随机程序有时会返回似乎是正确的东西并不意味着它们是正确的。 这只意味着你很幸运。 这运气永远不会持续。