我在C++中使用std :: string :: iterators很难.这段代码编译很好(仍然没有得到正确的输出,但这是我的错:TODO,修复算法)在Dev-C++中,我没有得到运行时错误.错误是使用Visual Studio Express 2008 C++,我收到指向<xstring>的错误:"Expression:string iterator not dereferencable",并指向<xstring>文件的第112行.
我的调试告诉我,我可能试图在句子输入结束时取消引用,但我看不到哪里.任何人都能解释一下吗?
std::string wordWrap(std::string sentence, int width)
{
std::string::iterator it = sentence.begin();
//remember how long next word is
int nextWordLength = 0;
int distanceFromWidth = width;
while (it < sentence.end())
{
while (*it != ' ' && it != sentence.end())
{
nextWordLength++;
distanceFromWidth--;
it++;
}
if (nextWordLength > distanceFromWidth)
{
*it = '\n';
distanceFromWidth = width;
nextWordLength = 0;
}
//skip the space
it++;
}
return sentence;
}
Run Code Online (Sandbox Code Playgroud) 我需要尽可能高效的方法来移动数组的内容.我需要将每个数组位置的内容向右移动并忽略第一个,这样我就可以在那里写一个新值.
这就是我所拥有的:
#define LENGTH 5
int myArray[LENGTH] = {1, 2, 3, 4, 5};
int *pa = myArray + (LENGTH - 1);
for (ushort i = 5; i > 0; i--) {
*pa = *(pa - 1);
pa--;
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是将for循环的两行组合成一个操作.就像是:
*pa = *(pa--);
Run Code Online (Sandbox Code Playgroud)
但是,结果是未定义的.我坚持使用我已经使用的东西吗?
编辑:我应该澄清这不是我正在使用的实际代码,只是一个快速的例子来演示我所追求的构造.
我有以下(截断的)类声明:
template <typename T>
class btree
{
public:
btree(const btree<T>& original); //This is btree's copy constructor
private:
struct btree_node
{
btree_node(const btree_node &other)
{
//This is node's copy constructor
}
}
btree_node* headNode;
}
Run Code Online (Sandbox Code Playgroud)
并且btree的复制构造函数以这种方式实现:
template <typename T>
btree<T>::btree(const btree<T>& original)
{
headNode = new btree_node(original.*headNode);
}
Run Code Online (Sandbox Code Playgroud)
原始.*headNode应该返回original.headNode指向的btree_node,从而匹配btree_node的拷贝构造函数参数.
但是我收到以下错误:
错误:((B树*)此) - > B树:: headNode'不能用作部件指针,因为它是类型为"B树:: btree_node*"
我究竟做错了什么?
我将面对奇怪的行为,将数组中的单个项目(或更多甚至解除引用)转换为单个算术类型.
下面是一个简化的测试用例:
void test1()
{
unsigned char test[10] = {0};
unsigned long i=0xffffffff;
*((unsigned long *)(&test[3])) = i;
int it;
for ( it = 0 ; it < 10 ; it++ )
{
printf("%02x ", test[it]);
}
}
void test2()
{
unsigned char test[10] = {0};
unsigned char test2[10] = {0};
test[2]=0xFF;
test[3]=0xFF;
*((unsigned short *)(&test2[1])) = *((unsigned short *)(&test[2]));
int it;
for ( it = 0 ; it < 10 ; it++ )
{
printf("%02x ", test2[it]);
}
} …Run Code Online (Sandbox Code Playgroud) 我在访问另一个结构中的char*时遇到问题,继承代码:
User_Network.c:
struct User_Networks_t {
SocialNetwork network;
};
typedef struct User_Networks_t* User_Networks;
void aaa(User_Networks u1)
{
u1->network->Name = "test"; /// ERROR: dereferencing pointer to incomplete type
}
Run Code Online (Sandbox Code Playgroud)
这是我在SocialNetwork.h中的内容:
typedef struct SocialNetwork_t* SocialNetwork;
Run Code Online (Sandbox Code Playgroud)
SocialNetwork.c中的结构:
struct SocialNetwork_t {
char *Name;
};
Run Code Online (Sandbox Code Playgroud)
为什么我会收到这个错误?
问题摘要:我指向一个类实例的指针,但是,当我尝试取消引用此指针并访问实例的属性时,我得到一个EAccessViolation异常,因为它取消引用"Nil".
我在单位范围内声明了指针:
private
CurrentRXFrame: ^TSXcpFrame;
Run Code Online (Sandbox Code Playgroud)
每次我的程序收到一个帧时,指针都会更新为指向这个最新的帧:
procedure TfrmFoo.OnReceivingFrame(Sender: TObject);
var
SXcpFrame: TSXcpFrame;
begin
SXcpFrame := TSXcpFrame.Create();
CurrentRXFrame := @SXcpFrame;
Run Code Online (Sandbox Code Playgroud)
我尝试在同一单元中的其他一些例程中取消引用指针,但得到一个异常:
// `FrameBytes` is merely a dynamic array of type "Byte".
PrintMsg(IntToHex(CurrentRXFrame^.FrameBytes[0], 2));
Run Code Online (Sandbox Code Playgroud)
例外:
raise exception class EAccessViolation with message 'Access violation at address 004DD1FE [...] Read of address 00000010.
如果我在此行之前设置断点,则相关变量评估为:
CurrentRXFrame := $18FD10
CurrentRXFrame^ := nil
CurrentRXFrame^.FrameBytes := Inaccessible value
Run Code Online (Sandbox Code Playgroud)
问题:如何TSxcpFrame通过指针访问类实例的属性?
我正在编写一些用于从双向链表中删除节点的代码,我遇到了以下语法.虽然我能够理解语法正在做什么但是不能得到top get下面的代码如何可能
struct dll{
int data;
struct dll *next;
struct dll *prev;
};
Run Code Online (Sandbox Code Playgroud)
并且在某些功能中有这种语法
else{
temp2=temp->prev;
temp2->next=temp->next;
temp->next->prev=temp2;
free(temp);
}
Run Code Online (Sandbox Code Playgroud)
我知道temp->next它使temp指针指向的是什么next node,从语法中我也可以理解,temp->next->prev这会使指针指向prev pointer of the next node.
但问题是如何评估这种语法?
请考虑以下代码:
int main()
{
int* p = new int(3);
p+=4;
std::cout<<*p<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我的编译器(Visual Studio 2012)打印:-7514522142int这种情况.
那么我们能以某种方式推断出输出并且这段代码合法吗?
我有两个不同的代码示例.在第一个代码中,可以取消引用:
void getValue(int *myPointer)
{
*myPointer = 10000;
return;
}
int main()
{
int get_the_value = 2;
getValue(&get_the_value);
printf("The value of get_the_value = %d\n", get_the_value);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是在下面的代码中,不可能在func()中取消引用*B. 我从互联网上下面有这个代码,他们说:
" B是一个指向int的指针,因此B [0]是一个int,你不能取消引用一个int. "
但是*myPointer在第一个代码中也不是int类型吗?
所以我的问题是:为什么解除引用在第一个代码中工作而在第二个代码中不起作用?
#include <stdio.h>
int func(int *B){
*B[0] = 5;
}
int main(void){
int B[3] = {1, 2, 3};
printf("b[0] = %d\n\n", B[0]);
func(&B);
printf("b[0] = %d\n\n", B[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有这个声明:
list<string*>::const_iterator iter;
Run Code Online (Sandbox Code Playgroud)
我想了解的类型是否*iter为:string*,const string*或别的东西。
我读到cost_iterator返回参考。一方面,列表包含string*,迭代器指向这些列表。另一方面,const_iterator它指向的值应该是,const并且它的作用就像列表中的数据是const?尽管不是真的吗?不确定我缺少什么,正确的答案是什么。