C-如何将单个字符从一个char **复制到另一个char **



如果以特定格式输入,我正在尝试编写一个程序,以将单词分解为段/音节。我想以格式输入一个单词:

[d-i-s][c-o-#][v-er-#]

并以格式存储:

syllable[0]=dis
syllable[1]=co
syllable[2]=ver
到目前为止
syllable[0]=[d-i-s
syllable[1]=[c-o-#
syllable[2]=[v-er-#

所以现在我只想清理它并剥离不必要的角色!我以为我会制作一个新数组,并在旧数组的字母上复制,只要它们不是[ - #。但是对于我的一生,我无法弄清楚如何将正确的字母复制到另一个数组中!

我知道我不能做:

cleanArray[i][j] = dirtyArray[i][k] 

因为cleanarray [i]是一个char*,我不能编辑吗?但是我可以做什么?

我已经阅读了许多类似的问题,这些问题提出了strncpy和snprintf(如何将char阵列复制到c?,strcpy和printf的另一个char阵列和多维char阵列c(,但我已经尝试过这些,我可以使他们起作用。我什至尝试将CleanArray放入3个维度,希望我能够将单个字母保存到CleanArray [i] [J]为char*s,这可能是完全错误的。

正确的方法是什么?抱歉,如果很明显,但是我已经花了几个小时了,现在非常非常困惑。.我真的很感谢您提供的任何建议!

这是我的代码:

char** cleanStrings (char**dirtyList, int arrayLength)
{
    int i, j, k;
    char** cleanList = (char**)calloc(arrayLength, CHARLEN);
    for (i=0; i<arrayLength; i++)
    {
        k= 0;
        cleanList[i] = (char*)calloc(10,CHARLEN);
        for (j=0; j<strlen(dirtyList[i]+1);j++)
        {
            if (dirtyList[i][j] == '[') continue;
            else if (dirtyList[i][j] == '#') continue;
            else if (dirtyList[i][j] == '-') continue;
            else 
                //i know this is wrong, but what is the right way of doing it?
                cleanList[i][k] = dirtyList[i][j];
                k++;    
        }
    }   
    return cleanList;
}

编辑

感谢您的所有评论,我现在已经有效了!与我的想法相反,正如Barmar指出的那样,没有什么错:

cleanArray [i] [j] = dirtyArray [i] [k]

我的代码不起作用,因为我犯了许多其他错误: - 播放calloc的返回值 - 不适当分配Calloc的内存 - 校准括号

我还将代码放在标题文件中,我认为它包含了自己的问题。

假设您使用的是calloc size参数错误。这些char** cleanList = (char**)calloc(arrayLength, CHARLEN);cleanList[i] = (char*)calloc(10,CHARLEN);之一是错误的。您也不应施放malloc() / calloc()的返回值。为了易读和代码流,我还替换了if的语句。您还编写for (j=0; j<strlen(dirtyList[i]+1);j++)而不是for (j=0; j<strlen(dirtyList[i])+1;j++),因为strlen()计算没有的字符串的长度。在这里,代码很少。

char** cleanStrings (char**dirtyList, int arrayLength)
{
    int i, j, k;
    char **cleanList = calloc(arrayLength,sizeof * cleanList);
    for (i=0; i<arrayLength; i++)
    {
        k= 0;
        cleanList[i] = calloc(10,sizeof * cleanList[i]);
        for (j=0; j<strlen(dirtyList[i])+1;j++)
        {
            if ((dirtyList[i][j] != '[') && (dirtyList[i][j] != '#') && (dirtyList[i][j] != '-') ){
                cleanList[i][k] = dirtyList[i][j];
                k++;
            }
        }
    }   
    return cleanList;
}

您没有为cleanList分配足够的内存。我认为CHARLENsizeof(char),即1个字节。但是cleanList的元素是char*,即4或8个字节,分配太小了。应该是:

char **cleanList = calloc(arrayLength, sizeof(char *));

使用malloccalloc时的一般规则是乘数始终是sizeof (T),其中T是较少*的目标类型。因此,如果您要分配给char **,则为sizeof(char *)

最新更新