我正在尝试乘以2个整数,我总是得到一个负数,有人可以帮助我吗? (使用此功能,我试图从这个字符串“3924456639”一个整数)
这是我的代码:
long temp = 0;
fgets(buf, sizeof buf, stdin);
for(int i = 0; i < sizeof buf ;i++){
if(buf[i] != ' ' && buf[i] != '\n'){
temp *= 10;// <- gets negative
temp = temp + buf[i] - '0';
}}
答案 0 :(得分:4)
您需要检查系统中sizeof(long)的大小,可能是4。
32位长变量将保持最大值2147483647,如果您在其中存储更大的值,它将进入负范围,因此您需要声明temp
无符号长
答案 1 :(得分:1)
您可以使用strtol。无需重新发明轮子。
long int strtol(const char *str, char **endptr, int base)
答案 2 :(得分:1)
您的主要问题是您的循环遍历所有缓冲区<?php
$email = $_POST['email'];
$password = $_POST['password'];
$key = 'Key with 56 characters';
function login($email, $password, $mysqli) {
global $key;
if ($stmt = $mysqli->prepare("SELECT id_customer, firstname, passwd
FROM ps_customer
WHERE email = ? LIMIT 1")) {
$stmt->bind_param('s', $email);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($user_id, $username, $db_password);
$stmt->fetch();
$password = md5($key.$password);
if ($stmt->num_rows == 1) {
if (checkbrute($user_id, $mysqli) == true) {
// Send email if blocked
return false;
} else {
if ($db_password == $password) {
$user_browser = $_SERVER['HTTP_USER_AGENT'];
$user_id = preg_replace("/[^0-9]+/", "", $user_id);
$_SESSION['user_id'] = $user_id;
$username = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $username);
$_SESSION['username'] = $username;
$_SESSION['login_string'] = md5($password.$user_browser);
return true;
} else {
$now = time();
if (!$mysqli->query("INSERT INTO login_attempts(user_id, time)
VALUES ('$user_id', '$now')")) {
header("Location: ../error.php?err=Database_error:login_attempts");
exit();
}
return false;
}
}
} else {
return false;
}
} else {
header("Location: ../error.php?err=Database_error:Cannot_prepare_statement");
exit();
}
}
?>
,而不是仅仅单步执行它包含的buf
终止字符串。
例如,如果我们假设'\0'
被声明为buf
,我们输入字符串char buf[100];
,那么"3924456639"
将包含:
buf
然后你的循环将正确地翻阅数字并忽略{'3','9','2','4','4','5','6','6','3','9','\n','\0', ... and 88 bytes of garbage}
。 但它不会停止。由于'\n'
既不是'\0'
也不是' '
,'\n'
会乘以10而temp
是添加。对于那些既不是'\0' - '0'
也不是' '
的88字节垃圾中的每一个都是如此。
要解决此问题,请更改:
'\n'
为:
for(int i = 0; i < sizeof buf ;i++){
或:
for(int i = 0; i < strlen(buf) ;i++){
(如果您想使用for(int i = 0; buf[i] != '\0' ;i++){
,请记住#include <string.h>
。)
注意:
strlen()
可能对您的号码而言太小。long
。