0

编程(学校)的新手,我对这是什么/为什么会发生有点困惑。

我有一个循环遍历一个元素数组,对于每个元素,我都取数组的整数,使用函数 getelementsymbol 将其转换为字符,并使用 strcat 附加到我的临时数组。我遇到的问题是我的临时数组的元素包含继续它的元素的残差。这是我的代码片段。我收到的输出是这样的:

单词1

word1word2

word1word2word3

char* elementsBuildWord(const int symbols[], int nbSymbols){
/*  ROLE            takes a list of elements' atomic numbers and allocate a new string made
                    of the symbols of each of these elements
PARAMETERS      symbols     an array of nbSymbols int which each represent the atomic number
                                of an element
                    nbSymbols   symbols array's size
RETURN VALUE    NULL    if the array is of size <= 0
                            or if one of the symbols is not found by our getElementSymbol function
                    other   the address of a newly allocated string representing the    concatenation
                            of the names of all symbols
 */
    char s1[MAX_GENERATED_WORD_LENGTH];
    int y;
    char *s2;
    size_t i;

    for (i = 0; i < nbSymbols; i++){
        y = symbols[i];
        s2 = getElementSymbol(y);
        strcat(s1, s2);         
    }
    printf("%s ", s1);
}
4

2 回答 2

1

首先,你s1的没有初始化。strcat函数将新字符串附加到现有字符串。这意味着你s1必须从一开始就是一个字符串。未初始化的 char 数组不是字符串。一个好主意是将您声明s1

char s1[MAX_GENERATED_WORD_LENGTH] = { 0 };

或者至少做

s1[0] = '\0';

在开始你的周期之前。

其次,您的getElementSymbol函数返回一个char *指针。那个指针指向哪里?谁管理它指向的内存?这在您的代码中并不明显。该函数可能返回一个无效指针(如指向本地缓冲区的指针),这就是为什么可能会看到各种异常的原因。没有看到它是如何实现的,就没有办法说。

于 2013-11-08T00:28:00.923 回答
0

strcat应该附加到一个字符串。strcpy如果要覆盖现有字符串,请使用。如果你真的想要,你也可以使用s1[0] = '\0';beforestrcat来“空白”字符串,但看起来你真的想要strcpy.

从上面的代码片段中甚至不清楚您为什么需要s1- 您可以打印s2...

于 2013-11-08T00:27:57.483 回答