0

我在这里发布了一个问题堆栈溢出并得到了这个代码,我还有一些关于代码的问题,所以我为此提出了一个单独的问题,因为问题是不同的。

以下代码给了我如下错误(由注释指示):

#include <iostream>
#include <string>
#include <bitset>
using namespace std;
#include <vector>  

int main() {

string s;
int i;
int j;


//how to take string s as input from user and feed it to the code?
std::vector<uint16_t> bitvec;
unsigned char* cp = s.c_str()+1;
while (*cp) {
   uint16_t bits = *(cp-1)>>8 + *(cp);  // error1
   bitvec.push_back(bits);
 }


 uint32_t sum=0;

for(std::vector<int16_t>::iterator j=bitvec.begin();j!=bitvec.end();++j) { //error2
sum += *j;
uint16_t overflow = sum>>16;  //capture the overflow bit, move it back to lsb
sum &= (1<<16)-1;    //clear the overflow
sum += overflow;     //add it back as lsb
}

//how can i see output of final sum+

//error1: std::vector bitvec; //我收到此行的“uint16_t 未在范围内声明”和“模板参数无效”的错误

//error2: valid type in declaration before j (这是什么意思)

问题 1:我如何从用户那里获取字符串 s 的输入?为什么我不能使用 cout << "enter string" 然后使用 getline(cin,s)?同样我怎么能看到输出?我可以使用 cout<

问题2:我是否错过了代码可能需要的任何标题?

4

2 回答 2

1

uint16_t 通常在 #include <stdint.h>linux 上定义。你需要包含这个头文件。

于 2013-11-08T19:42:34.477 回答
0

编译器找不到您正在使用的类型,因为您没有包含定义它们的正确头文件。

尝试这个:

#include <cstdint> //uint16_t and similar defined in here

std::vector<std::uint16_t> bitvec;
unsigned char* cp = s.c_str()+1;
while (*cp) {
   std::uint16_t bits = *(cp-1)>>8 + *(cp);  // error1
   bitvec.push_back(bits);
 }

请注意,#include <cstdint>不会将这些类型拉入全局命名空间(这就是为什么首选它的原因#include<stdint.h>,我认为这就是 stdint.h 现在贬值的原因),但这意味着您必须放在std::每种类型的前面。或者,您可以使用这样的 using 语句将它们带入范围using std::uint16_t。您的代码中有一个using namespace std,因此这将自动为您执行此操作。

另外,我认为如果您像这样使用 auto ,您会发现迭代器代码会更好:

for(auto j = bitvec.begin(); j != bitvec.end(); ++j) { 
    sum += *j;
    std::uint16_t overflow = sum>>16;  //capture the overflow bit, move it back to lsb
    sum &= (1<<16)-1;    //clear the overflow
    sum += overflow;     //add it back as lsb
}
于 2013-11-08T20:00:58.110 回答