在另一个2D数组中使用STRCPY复制2D字符数组

3

我想使用字符串函数strcpy将一个二维字符数组复制到另一个二维字符数组中,但是它给出了访问冲突的错误。我不知道我做错了什么。我在这里贴上了代码和错误信息,请问有人能告诉我错在哪里吗?

int searching(char *name[],char * namesearched,int size)
{
    int count =0;
    int start = 0;
    int end = count;
    for(;start<=end;)
    {
        int mid = (start + end)/2;
        if(strcmp(namesearched,name[mid])==0)
        {
        return mid;
        }
        else if(strcmp(namesearched,name[mid])==1)
        {
         end=mid -1; 
        }
        else if(strcmp(namesearched,name[mid])==-1)
        {

            start = mid +1;
        }
    }
    return -1;
}

void sorting(char **name,char ** meaning,int count)
{
    for (int i=0;i<count;i++)
    {
        for(int j=i+1; j<count; j++)
        {
            char tempname[100];
            char tempmeaning[100];
            if(strcmp(name[j-1],name[j])>0)
            {
                strcpy(tempname,name[j]);
                //strcpy(name[j],tempname);
                strcpy(name[j-1],name[j]);
                strcpy(name[j],name[j-1]);
                strcpy(name[j-1],tempname);

                strcpy(tempmeaning,meaning[j]);
                strcpy(meaning[j],meaning[j-1]);
                strcpy(meaning[j-1], tempmeaning);
            }
        }
    }
}

void main()
{
    int size=60;
    int count=0;
    char namesearched[100];
    cout << "Enter the name to be searched: ";
    cin.getline(namesearched , 100);
    char** name= new char * [size];
    char** meaning = new char * [size];
    for(int i=0;i < size ; i++)
    {
        name[i]= new char [100];
        meaning[i]= new char[100];
        count ++;
    }
    name[0] = "Journalist";
    name[1] = "Blister";
    name[2] = "List";
    name[3] = "Listen";
    name[4] = "Novelist";
    name[5] = "Song";
    name[6] = "Eat";
    name[7] = "West";
    name[8] = "Idealist";
    name[9] = "Industry";
    name[10] = "Legalist";
    name[11] = "Write";
    name[12] = "Medal";
    name[13] = "Nation";
    name[14] = "Accident";
    name[15] = "Nest";
    name[16] = "Bird";
    name[17] = "Animal";
    name[18] = "Lion";//wrong
    name[19] = "Pigeon";
    name[20] = "Real";
    name[21] = "Accept";
    name[22] = "Ability";
    name[23] = "Bald";
    name[24] = "Backbite";
    name[25] = "Wakeful";
    name[26] = "Absolute";
    name[27] = "Wail";
    name[28] = "Abiding";
    name[29] = "Unacceptable";
    name[30] = "Tacker";
    name[31] = "Vain";//wrong
    name[32] = "Abolish";
    name[33] = "Taking";
    name[34] = "Unarmed";
    name[35] = "Habit";
    name[36] = "Notus";
    name[37] = "Impecle";
    name[38] = "Accelerate";
    name[39] = "Agony";
    name[40] = "Sulk";
    name[41] = "Nowise";
    name[42] = "Hypocrisy";
    name[43] = "Nape";
    name[44] = "Eccentric";
    name[45] = "Naturally";
    name[46] = "Gratitude";
    name[47] = "Mesmerizing";
    name[48] = "Epic";
    name[49] = "Abstain";
    name[50] = "Enactment";
    name[51] = "Hammock";
    name[52] = "Nodal";
    name[53] = "Laborious";
    name[54] = "Nonverbal";
    name[55] = "Haggle";
    name[56] = "Notorious";
    name[57] = "Lagger";
    name[58] = "Pathetic";
    name[59] = "Norms";


    meaning[0] = "Sahaafi";
    meaning[1] = "Chaala";
    meaning[2] = "Fehrist";
    meaning[3] = "Sunna";
    meaning[4] = "Naval Nigaar";
    meaning[5] = "Ganna";
    meaning[6] = "Khanna";
    meaning[7] = "Maghrib";
    meaning[8] = "Tadawuri";
    meaning[9] = "Sannat";
    meaning[10] = "Zabta Parast";
    meaning[11] = "Likhna";
    meaning[12] = "Tangha";
    meaning[13] = "Qoom";
    meaning[14] = "Hadsa";
    meaning[15] = "Ghonsla";
    meaning[16] = "Parinda";
    meaning[17] = "Janwar";
    meaning[18] = "Shair";
    meaning[19] = "Kabootar";
    meaning[20] = "Haqeekat";
    meaning[21] = "Qabool";
    meaning[22] = "Kabliyat";
    meaning[23] = "Ganja";
    meaning[24] = "Ghebat Karna";
    meaning[25] = "Jagta";
    meaning[26] = "Bikul";
    meaning[27] = "Gham Karna";
    meaning[28] = "Mustakil";
    meaning[29] = "NaGawar";
    meaning[30] = "Jorna Wala";
    meaning[31] = "Gari";
    meaning[32] = "Rad kar dena";
    meaning[33] = "Dil-chasp";
    meaning[34] = "Nehatta";
    meaning[35] = "Addat";
    meaning[36] = "Dakni hawwa";
    meaning[37] = "Rokna";
    meaning[38] = "Taiz karna";
    meaning[39] = "Sakht Takleef";
    meaning[40] = "Roth Jana";
    meaning[41] = "Hargiz Nahi";
    meaning[42] = "Naffaq";
    meaning[43] = "Mankaa";
    meaning[44] = "Sanki";
    meaning[45] = "Fitratan";
    meaning[46] = "Tashakur";
    meaning[47] = "Mashoor Karna";
    meaning[48] = "Razmiya";
    meaning[49] = "Baaz Rakhna";
    meaning[50] = "Nifaaz";
    meaning[51] = "Jholay ki tarhan ka Bichona";
    meaning[52] = "Gutheela";
    meaning[53] = "Mehnat Talab";
    meaning[54] = "Ghair Lafzey";
    meaning[55] = "Takrar Karna";
    meaning[56] = "Badnam";
    meaning[57] = "Ahista Chalnay walla";
    meaning[58] = "Intehai afsoos naak baat";
    meaning[59] = "Mayar";

    int mid;
    sorting( name , meaning , count);
    int mid = searching(name,namesearched,count); 
    if( mid == -1 )
    {
        char ** tempname = new char* [60];
        char ** tempmeaning = new char*[60];
        if(count == size)
        {
            int increase =(10 * size)/100;
            size = increase + size;
            for(int i=0 ; i<size ; i++)
            {
                tempname[i] = new char [100];
                tempmeaning[i]= new char [100];
            }
            for(int i = 0; i<count ; i++)
            {                
                strcpy(tempname[i],name[i]);
                strcpy(tempmeaning[i],meaning[i]);
            }
        }
        strcpy(tempname[count] , namesearched);
        cin >> tempmeaning[count];
        count ++;

        sorting( tempname , tempmeaning , count);

        for (int i =0;i < count ;i++)
        {
            delete [] name[i];
            delete [] meaning[i];
        }
        //delete [] name;
        //delete [] meaning;
        name = tempmeaning;
        meaning = tempmeaning;
        tempmeaning = NULL ;
        tempname = NULL;
    }
    else 
    {
        cout <<"The meaning of " << namesearched << " is: " << meaning[mid] << endl;
    }
    _getch();
}

访问位置0x001fbe5c时写入违规。

countsize的值均为60。

另外一个事情是,strcpy(tempname , name[j])这一行可��工作,但当遇到strcpy(name[j] , name[j-1])时,会抛出访问冲突错误。


请在您的帖子中添加“count”和“i”的值。 - Nikolai Saiko
@FozanGardezi 显然你的输入数据有误。你的代码似乎在有效输入时不会崩溃:http://ideone.com/it8Qzv。因此,你应该仔细检查并相应地编辑你的问题:http://stackoverflow.com/help/mcve。 - PeterT
@PeterT 当我在代码中引入2D数组时,它可以使用1D数组正常工作,但是开始崩溃。strcpy(tempname,name[j]); 这里tempname是一个1D数组,而name是一个2D数组。我将数组从name[j]复制到tempname中,并且它可以正常工作,但是当我尝试执行以下操作时,它会崩溃:strcpy(name[j],name[j-1]); - Fozan Gardezi
@FozanGardezi 我无法理解你说的话,请展示一个完整的例子以重现问题。 - PeterT
这个标签是 C++,但它并不是真正的 C++(至少在这里大部分人的观点),它应该被重新标记为 C。(如果使用真正的 C++,这可能只需要一行代码) - kebs
@PeterT 我已经添加了代码。 - Fozan Gardezi
2个回答

2
这个函数声明
void sorting(char *name[],char *meaning[],int size,int count);

不处理二维数组。

例如,如果您有如下的二维数组:

char name[60][100];
char meaning[60][100];

如果是函数声明,它将会长这样:
void sorting( char name[60][100], char meaning[60][100], size_t count );

或者

void sorting( char name[][100], char meaning[][100], size_t count );

或者

void sorting( char ( *name )[100], char ( *meaning )[100], size_t count );

第三个参数的值应该等于60。

至于你的函数声明,例如这个参数 char *name[] 的类型是不完整的一维指向char *类型的指针数组,调整为 char **类型。如果相应的参数是指向字符串字面量的指针数组,则该函数的行为未定义,因为你不能更改字符串字面量。

因此,看起来你处理数组的方式不正确,它们的定义与函数代码的逻辑不符。

此外,参数size在函数中未使用。

因此,你的代码最初就是错误的。

请注意,这个if语句中的条件

if(strcmp(name[j-1],name[j]))

应该看起来像

if ( strcmp( name[j-1], name[j] ) > 0 )

如果你想将数组按升序或类似排序

if ( strcmp( name[j-1], name[j] ) < 0 )

如果您想按降序排序数组。
编辑:在您追加问题后,可以看到以下情况:1)存在内存泄漏,因为最初指向分配的内存的指针被重新赋值为字符串文字的地址;2)您正在尝试更改不可变的字符串文字。
相反,例如:
name[0] = "Journalist";

你需要编写代码

strcpy( name[0], "Journalist" );

1
我尝试过了,函数原型我写成了 void sorting(char **name,char ** meaning,int count),但仍然出现相同的错误。我使用了你提供的解决方案进行尝试,但还是出现了相同的错误。 - Fozan Gardezi

1
你不需要使用2D字符数组,只需使用字符串数组。因此,您可以在不使用strcpy的情况下完成它。例如:
void sorting(char *name[],char *meaning[], int count)
{
    for (int i = 0; i < count; i++)
    {
        for(int j = 1; j < count - i; j++)
        {
            char *tempname;
            char *tempmeaning;
            if(strcmp(name[j-1],name[j]) > 0)
            {
                tempname = name[j];
                name[j] = name[j-1];
                name[j-1] = tempname;

                tempmeaning = meaning[j];
                meaning[j] = meaning[j-1];
                meaning[j-1] = tempmeaning;
            }
        }
    }
}

char *name[] 是一个指向 char 的指针数组。指向 char 的指针可以被解释为指向 char 数组的第一个元素(字符串)的指针。因此,如果你想在数组中交换两个字符串,你只需要交换指向那些字符串的指针即可。


我知道这个,但我不明白为什么strcpy函数不起作用。 - Fozan Gardezi
strcpy 不起作用是因为 name[i] 是一个指向常量的指针。你试图修改常量,这会导致错误。 - Tony O
但是当我逐个复制它的索引时,为什么它会复制它,如果它是常量? - Fozan Gardezi
1
你不能这样做 char *g = "foo"; g[0] = 'b' 但是你可以这样做 char *g = "foo"; g = "bar" - Tony O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接