我想定义一个字符串指针数组,使用下面语句: 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"

参考技术A 这种写法相当于,静态的字符型的二维指针。把他们改成
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 &lt;std::string&gt;&gt; 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。 你的数组不包含指向stringnew创建的对象的string*指针,只有stringnew[]创建的对象的数组,所以没有需要在任何元素上使用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]; 但提示错误,求解的主要内容,如果未能解决你的问题,请参考以下文章

字符串常量初始化指针

字符数组与字符指针

浅谈特殊的指针。

难道指针数组不能指向多个字符串吗?

C语言如何定义指针指向字符型二维数组

转:字符数组与字符指针