为什么 strtol returns 为零?
why strtol returns zero?
我正在为一个功能而苦苦挣扎。
目标是检查用户输入(已清理)并采取相应行动。
函数如下所示:
bool checkMove(board *Minesweeper,char *input){
char *tmp;
switch(input[0]){
case '?':
if(isalpha(input[1])){
input[1]=toupper(input[1]);
long eval = strtol(input, &tmp, 10);
if(tmp==input){
printf("something went wrong :(\n");
}
printf("Number: %ld\n",eval);
if (eval>Minesweeper->height) {
printf("Out of Bounds!\n");
} else {
printf("Valid move\n");
}
// other stuff
输出:
Your Move: ?A21
something went wrong :(
Number: 0
Valid move
我正在传递输入值,因此它不是本地函数。相同的代码 (strtol) 在不同的上下文中工作得很好。
我不认为这是局部变量的问题。
来自man pages:
"The strtol()
function converts the initial part of the string..."
您的字符串以“?A
”开头,因此函数失败。一种解决方案是改为执行以下操作:
long eval = strtol(input+2, &tmp, 10);
这样你 "skip" input
中的前 2 char
秒。
正如许多人建议的那样,要开始数字转换,请从 input + 2
开始。
// long eval = strtol(input, &tmp, 10);
long eval = strtol(input + 2, &tmp, 10);
谨慎的代码会首先检查严格的长度至少为 2。
if (input[1]) { // we know input[0] is a '?'`
long eval = strtol(input + 2, &tmp, 10);
后面的转换校验也需要修改
// if(tmp == input){
if(tmp == input + 2) {
printf("something went wrong :(\n");
}
我正在为一个功能而苦苦挣扎。 目标是检查用户输入(已清理)并采取相应行动。
函数如下所示:
bool checkMove(board *Minesweeper,char *input){
char *tmp;
switch(input[0]){
case '?':
if(isalpha(input[1])){
input[1]=toupper(input[1]);
long eval = strtol(input, &tmp, 10);
if(tmp==input){
printf("something went wrong :(\n");
}
printf("Number: %ld\n",eval);
if (eval>Minesweeper->height) {
printf("Out of Bounds!\n");
} else {
printf("Valid move\n");
}
// other stuff
输出:
Your Move: ?A21
something went wrong :(
Number: 0
Valid move
我正在传递输入值,因此它不是本地函数。相同的代码 (strtol) 在不同的上下文中工作得很好。 我不认为这是局部变量的问题。
来自man pages:
"The strtol()
function converts the initial part of the string..."
您的字符串以“?A
”开头,因此函数失败。一种解决方案是改为执行以下操作:
long eval = strtol(input+2, &tmp, 10);
这样你 "skip" input
中的前 2 char
秒。
正如许多人建议的那样,要开始数字转换,请从 input + 2
开始。
// long eval = strtol(input, &tmp, 10);
long eval = strtol(input + 2, &tmp, 10);
谨慎的代码会首先检查严格的长度至少为 2。
if (input[1]) { // we know input[0] is a '?'`
long eval = strtol(input + 2, &tmp, 10);
后面的转换校验也需要修改
// if(tmp == input){
if(tmp == input + 2) {
printf("something went wrong :(\n");
}