我想定义一个字符串指针数组,使用下面语句: static char *ch[10]; 但提示错误,求解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想定义一个字符串指针数组,使用下面语句: static char *ch[10]; 但提示错误,求解相关的知识,希望对你有一定的参考价值。
用的是C-Free
错误显示为:[Error] D:\C\Header\Ans.h:3: error: expected constructor, destructor, or type conversion before "char"
static char *ch1;
……
static char *ch10;
试试,看还能不能报错? 参考技术B VS无错,如果是编译器的区别,估计LZ的char *ch[10]是全局变量,那把static去掉也没关系 参考技术C VC6编译器没事。你看看你选的编译器。本回答被提问者采纳
从字符串指针数组中删除一个元素
【中文标题】从字符串指针数组中删除一个元素【英文标题】:Delete an element from string pointer array 【发布时间】:2021-06-10 01:26:59 【问题描述】:我有一个字符串指针数组 test_array。如果它有一个空字符串,我想走到最后并从数组中找到一个非空元素,将其复制到前一个空元素,最后删除数组的末尾我刚刚复制了。--我将如何使用删除呢? --我需要使用delete还是必须使用delete[]并将整个数组复制到一个新数组中?--delete是否也只删除数组中的指针或字符串?
#include <iostream>
#include <string>
int main()
std::string* test_array = new std::string[5];
int size = 4;
for (int i = 0; i <= size; ++i)//test_array[] 0=a 1=b 2=c 3=d 4=e
test_array[i] = char('a'+i);
test_array[1] = "";//test_array[] 0=a 1=empty 2=c 3=d 4=e
for (int i = 0; i <= size; ++i)
if (test_array[i].empty())
while(test_array[size].empty())//Find last position that isnt empty
delete &test_array[size];//Supposed to delete if empty,probably wrong but the only thing that passed compile
size--;
test_array[i] = test_array[size];
delete &test_array[size];//Supposed to delete if empty
size--;
for (int i = 0; i <= size; ++i)
std::cout<<"String is: "<<test_array[i]<<'\n';
std::cout<<"Deleted element: "<<test_array[4]<<'\n';//Shows deleted e
【问题讨论】:
将std::string* test_array
替换为std::vector <std::string>> test_array
。那么问题就很简单了。
Do i need to use delete or do i have to do delete[] and copy the whole array in a new one?
是的。但顺序相反:复制和删除[]。 Does delete only delete the pointer in the array or the string too?
你的数组不包含指针。什么问题?如果要删除中间的字符串,建议使用std::deque。
你的数组不包含指向string
用new
创建的对象的string*
指针,只有string
用new[]
创建的对象的数组,所以没有需要在任何元素上使用delete
,代码完成后只需要delete[]
数组本身。从元素中移动数据时,只需 clear()
或 move()
该元素即可重置它。
@Jeepsey。为什么必须显式删除该条目?从分配的措辞来看,您需要做的就是跟踪可用的“大小”,而 5 元素数组末尾的任何条目都只是垃圾。这是一个简单的交换问题,并将数组的结束索引减去 1。事实上,普通的旧 std::string test_array[5];
可以正常工作。换句话说,你的老师可能想看看你是否可以模仿 STL std::remove
算法函数,它不会删除任何东西。
不,在这段代码中根本不需要delete[]
数组和new[]
一个新数组。
【参考方案1】:
我有一个字符串指针数组 test_array。
test_array 不是“字符串指针数组”。它是一个指向字符串的指针。它指向动态数组的第一个元素。
从数组中找到一个不为空的元素,将其复制到前一个空的元素中,最后删除我刚刚复制的数组的末尾。
您不能“删除”数组的元素(除非它是指向动态对象/数组的指针,在这种情况下,您正在销毁和释放该元素指向的对象,并且该元素仍保留在数组中)。
数组的大小在 C++ 中不能改变。
所以我必须删除 [] 并新建一个并复制字符串?这是唯一的方法
首先,你可以移动而不是复制。
其次,您应该在删除之前移动,否则没有什么可移动的。
第三,不一定需要更改数组的大小。重新考虑为什么你认为你需要这样做。将这些元素留在最后也可以。
最后,另一种方法是使用std::vector
。我推荐这种方式。
附:您正在做的事情有一个标准算法。它叫std::remove
。
附言如果您不需要保持剩余元素的顺序相同,那么更有效的算法是将最后一个元素移动到“已删除”的元素之上。
【讨论】:
以上是关于我想定义一个字符串指针数组,使用下面语句: static char *ch[10]; 但提示错误,求解的主要内容,如果未能解决你的问题,请参考以下文章