COVER FLOW功能!数字变为负数

时间:2017-06-04 11:05:16

标签: c overflow

我正在尝试乘以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';

  }}

3 个答案:

答案 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()可能对您的号码而言太小。
  • 与@KALALEX指出的一样,您可以使用long