无法在C中使用strcpy复制指针数组中的字符串?

时间:2017-08-10 14:02:05

标签: c undefined-behavior strcpy string-literals

我正在进行一项练习,其中字符指针数组用作存储单词的方式。我不明白为什么我不能使用' strcpy'复制这个词' hoi'到main函数中数组的第二个元素。当我编译代码时,我收到消息'程序已停止工作'在CodeBlocks。

功能' numberOfWordsInDict'和' printDict'工作正常。

提前致谢。

setTimeout(function() {
        $('#middle').addClass('arrived');
}, 
4000);

5 个答案:

答案 0 :(得分:2)

数组dict是一个指向字符串文字的指针数组。

在本声明中

strcpy(dict[1],newWord1);

您正试图在另一个字符串文字中复制一个字符串文字。

字符串文字在C和C ++中是不可修改的。任何修改strig文字的尝试都会导致程序的未定义行为。

来自C标准(6.4.5字符串文字)

  

7未指明这些阵列是否与它们不同   元素具有适当的值。 如果程序尝试   修改这样的数组,行为是未定义的。

如果要复制其元素中的字符串文字或动态分配的字符数组的一维数组,则应声明二维字符数组。

程序可以按以下方式查看

#include <stdio.h>
#include <string.h>

#define N   9

size_t numberOfWordsInDict( char dict[][N] )
{
    size_t n = 0;

    while ( *dict[n] ) ++n;

    return n;
}

void printDict( char dict[][N] )
{
    printf("Dictionary:\n");

    size_t n = numberOfWordsInDict( dict );
    if ( n == 0 )
    {
        printf("The dictionary is empty.\n");
    } 
    else
    {
        for ( size_t i = 0; i < n; i++ )
        {
            printf( "- %s\n", dict[i] );
        }
    }
}

int main(void) 
{
    char dict[10][9] = 
    {
        "aap", "bro ", "jojo", "koe", "kip", "haha", "hond", "    drop"
    };
    char *newWord1 = "hoi";

    printDict(dict);
    strcpy(dict[1], newWord1);
    printDict(dict);

    return 0;
}

程序输出

Dictionary:
- aap
- bro 
- jojo
- koe
- kip
- haha
- hond
-     drop
Dictionary:
- aap
- hoi
- jojo
- koe
- kip
- haha
- hond
-     drop

或者您可以使用可变长度数组。

请记住,根据C标准,没有参数的函数main应声明为

int main( void )

答案 1 :(得分:1)

由于"bro"是字符串常量而dict[1]指向它,dict[1]指向字符串常量。

当您使用strcpy(dict[1]), ...时,您正在尝试修改dict[1]指向的内容。但它指向一个常数。所以你试图修改一个常量。

不能修改常量。

答案 2 :(得分:0)

指针指向的内存是只读的,因为import './racks.js' import './deletedRacks.js' import './switches.js' import './deletedSwitches.js' const myApp = angular.module( 'myApp', [ 'RacksListController', 'DeletedRacksListController', 'SwitchesListController', 'DeletedSwitchesListController', 'ui.sortable' ] ); myApp.config(['$interpolateProvider', function($interpolateProvider) { $interpolateProvider.startSymbol('[['); $interpolateProvider.endSymbol(']]'); }]); 是字符串文字。

答案 3 :(得分:0)

根据我的理解,不可能写字符串文字。

答案 4 :(得分:0)

您需要在RW内存中保留存储空间并复制文字。您不必手动执行此操作:)

#define MAXDICTSIZE 25

int numberOfWordsInDict(char dict[][MAXDICTSIZE], int dictsize)
{
    int i, cnt = 0;
    for (i = 0; i < dictsize; i++)
    {
        if (strlen(dict[i]))
        {
            cnt++;
        }
    }
    return cnt;
}

void printDict(char dict[][MAXDICTSIZE], int dictsize)
{
    int i = 0;
    printf("Dictionary:\n");
    if (numberOfWordsInDict(dict, dictsize) == 0)
    {
        printf("The dictionary is empty.\n");
    }
    else
    {
        for (i = 0; i < dictsize; i++)
        {
            if(strlen(dict[i]))printf("- %s\n", dict[i]);
        }
    }
}

和main()中的某个地方

char dict[10][MAXDICTSIZE] = {
    "aap", "bro ", "jojo", "koe", "kip",
    "haha", "hond", "    drop", "","" };

char *newWord1 = "hoi";
printDict(dict, sizeof(dict)/sizeof(dict[1]));
strcpy(dict[1], newWord1);
printDict(dict, sizeof(dict) / sizeof(dict[1]));