我可以知道为什么这段代码没有给出任何输出吗?

MayI know why this code is not giving any output?

请帮我解决这个代码在特定行无限运行的查询。

它没有给出任何输出,因为在我编写代码来打印矢量的代码末尾。即使在我手动为向量“result”分配任何值之后,它仍然没有给出任何输出。为什么会这样?

#include<bits/stdc++.h>
using namespace std;

bool authorize(int strValue, int value, int M) 
{
   long int newValue = (strValue - (value * 131) % M);
   if (newValue >= 48 && newValue <= 57)
      return true;
   if (newValue > 65 && newValue <= 90)
      return true;
   if (newValue >= 97 && newValue <= 122)
      return true;
   return false;
}

int hashingfunct(string str, int M) 
{
   long int P, F, sum = 0;
   int len = str.length();
   for (int i = 0; i < len; i++)
   {
      P = pow(131, len - i - 1);
      F = (int)str[i];
      sum += (F * P) % M;
   }
   sum = sum % M;
   return sum;
}

int main()
{
   int n = 5;
   string str1, str2;
   vector<vector<string> > events;
   for (int i = 0; i < n; i++) {
      cin >> str1 >> str2;
      vector<string > temp;
      temp.push_back(str1);
      temp.push_back(str2);
      events.push_back(temp);
   }
   for (int i = 0; i < n; i++) {
      cout << events[i][0] << events[i][1];
   }
   /*
   INPUT FORMAT:
   setpassword 1
   setpassword 2
   setpassword 3
   authorize 49
   authorize 50
   */
   vector<int> result;
   int j = 0;
   long int m = pow(10, 9);
   long int M = m + 7;
   long int value, strValue;
   for (int i = 0; i < events.size(); i++)
   {
      strValue = stoi(events[i][1]);
      if (events[i][0] == "setPassword") {
         value = hashingfunct(events[i][1], M);
      }
      else if (strValue == value)
         result[j++] = 1;
      else if (authorize(strValue, value, M))
         result[j++] = 1;
      else
         result[j++] = 0;
   }

   for (int i = 0; i < result.size(); i++) {
      cout << result[i];
   }
}

您的程序具有完整的未定义行为。

让我们从第一个问题开始。在下面的检查代码

long int value, strValue;  // not initialised
for (int i = 0; i < events.size(); i++)
{
   // ... 
   // here it should have been "setpassword" (i.e. all are small letters)
   if (events[i][0] == "setPassword")
   {
       // if the check fails the `value` never get initialised!
       value = hashingfunct(events[i][1], M);
   }
   // If the `value` not been initialised, check happens with any garbage value here!
   else if (strValue == value) 

   // ...other code
}

您正在检查字符串是否是 "setPassword" 而不是 "setpassword"(即在 events 向量中看到,所有字符串都是小写字母)。

如果出错,value 将永远不会被初始化,这意味着它 and hence conducting this check else if (strValue == value) can cause any behaviour to your program (aka Undefined Behaviour)

其次,vector<int> result;开头是空的。因此稍后通过 std::vector::operator[] 访问元素

result[j++] = 1;
// ...
result[j++] = 1;
// ...
result[j++] = 0;

触发 access out of bounds (UB)。那里你只需要 result.emplace_back(/*value*/);result.push_back(/*value*/);,不需要冗余变量 j.

总之,你需要

#include <iostream>
#include <vector>
#include <string>

// ..other functions
int main()
{
   std::vector<std::vector<std::string> > events { 
      {"setpassword", "1"}, // can be also user input, like in your example
      {"setpassword", "2"},
      {"setpassword", "3"},
      {"authorize", "49" },
      {"authorize", "50" }
   };

   std::vector<int> result;
   const long int M = pow(10, 9) + 7;
   long int value{ 0 }, strValue{ 0 }; // default initialization
   for (const std::vector<std::string> row: events) // better use range-based loop
   {
      strValue = std::stoi(row[1]);
      if (row[0] == "setpassword") {
         value = hashingfunct(row[1], M);

         if (strValue == value)
            result.emplace_back(1);
         else if (authorize(strValue, value, M))
            result.emplace_back(1);
      }
      else
         result.emplace_back(0);
   }
}

作为旁注,

  • do not use using namespacestd;

Corrected code

#include<bits/stdc++.h>
using namespace std;
bool authorize(long int strValue,long int value,int M){
    long int value1=value*131;
    long int newValue=(strValue-(value1%M))%M;
    if(newValue>=48 && newValue<=57)
    return true;
    if(newValue>=65 && newValue<=90)
    return true;
    if(newValue>=97 && newValue<=122)
    return true;
 return false;
}
int hashingfunct(string str,int M){
    long int P,F,sum=0;
    int len=str.length();
    for(int i=0;i<len;i++){
        P=pow(131,len-i-1);
        F=(int)str[i];
        sum+=(F*P)%M;
    }
    sum=sum%M;
    return sum;
}
int main(){
    int n=5;
    string str1,str2;
    vector<vector<string> > events;
    for (int i=0;i<n;i++){
        cin>>str1>>str2;
        vector<string > temp;
        temp.push_back(str1);
        temp.push_back(str2);
        events.push_back(temp);
    }

/*
setPassword cAr1
authorize 223691457
authorize 303580761
setPassword d
authorize 100
*/
    vector<int> result;
    int j=0;
    long int m=pow(10,9);
    long int M=m+7;
    long int value,strValue;
    for(int i=0;i<events.size();i++){
        
        if(events[i][0]=="setPassword"){
            value=hashingfunct(events[i][1],M);
            continue;
        }
        strValue=stoi(events[i][1]);
        if(strValue==value)
        result.push_back(1);
        else if(authorize(strValue,value,M))
        result.push_back(1);
        else
        result.push_back(0);
        
    }
    

    for(int i=0;i<result.size();i++){
        cout<<result[i];
    }


}