【问题标题】:How can I copy individual chars from a char** into another char**?如何将单个字符从 char** 复制到另一个 char** 中?
【发布时间】:2017-06-01 11:41:30
【问题描述】:

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

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

并将其存储为以下格式:

syllable[0]=dis
syllable[1]=co
syllable[2]=ver

到目前为止,我已经设法使用分隔符 ']' 将其分成音节,并将其另存为 char**,格式如下:

syllable[0]=[d-i-s
syllable[1]=[c-o-#
syllable[2]=[v-er-#

所以现在我只想清理它并去掉不必要的字符!我想我会创建一个新数组并复制旧数组中的字母,只要它们不是 [ - #.但是对于我的一生,我无法弄清楚如何将正确的字母复制到另一个数组中!!

我知道我不能这样做:

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

因为 cleanArray[i] 是一个 char* 并且我无法对其进行编辑,对吗?但是我可以做什么?

我已经阅读了很多类似的问题,这些问题建议使用 strncpy 和 snprintf(how to copy char array to another char array in C?strcpy and printf a multidimensional char array C),但我已经尝试过这些问题,但我无法让它们工作。我什至尝试将 cleanArray 放入 3 维中,希望能够将单个字母作为 char*s 保存到 cleanArray[i][j] 中,这可能是完全错误的。

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

这是我的代码:

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;
}

编辑

感谢您的所有 cmets,我现在可以正常工作了!与我的想法相反,正如 Barmar 指出的那样:

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

我的代码不起作用,因为我犯了很多其他错误,例如: -casting calloc 的返回值 - 没有为 calloc 正确分配内存 - 不正确的括号

我也有一个头文件中的代码,我认为它包含它自己的问题。

【问题讨论】:

  • 不要在之后清理字符串,为什么不确保只添加“干净”的字符串开始呢?比如,如果您点击'[',您就知道一个音节正在开始,然后您跳过左括号。您还可以跳过破折号和散列。当您到达右括号']' 时,您结束音节并将其添加到表格中。循环搜索下一个音节开头,等等,直到你到达输入的结尾。
  • cleanList[i][k] = dirtyList[i][j]; 没有错。
  • (char**)calloc(arrayLength, CHARLEN) 应该是calloc(arrayLength,sizeof(char *))
  • 真的吗?为什么它不起作用呢?它运行但随后使控制台崩溃
  • 你没有分配足够大的数组,因为你给calloc()提供了错误的参数

标签: c arrays


【解决方案1】:

假设您使用的 calloc size 参数错误。其中char** cleanList = (char**)calloc(arrayLength, CHARLEN);cleanList[i] = (char*)calloc(10,CHARLEN); 之一是错误的。您也不应该强制转换 malloc() / calloc() 的返回值。出于易读性和代码流的目的,我还替换了 ifs 语句。您还写了for (j=0; j&lt;strlen(dirtyList[i]+1);j++) 而不是for (j=0; j&lt;strlen(dirtyList[i])+1;j++),因为strlen() 在没有\0 的情况下计算字符串的长度。这里是代码,改动很少。

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;
}

【讨论】:

  • k++ 应该在if 内。
  • 我把 k++ 放在了 if 但是当我运行你的代码时,我遇到了和我一样的问题......它运行然后崩溃控制台
  • @sally2000 我进行了新的代码编辑,现在观看。如果它不起作用,请您发布您的完整代码吗=
  • 该函数是一个长头文件的一部分,所以我将头文件的相关部分复制到一个单独的文件中,以便将其全部发布在这里。但是当我一起运行新文件时,它起作用了!
  • 所以我不知道是什么导致了最初的问题,但它一定是完全不同的原因
【解决方案2】:

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

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

使用malloccalloc 时的一般规则是乘数始终为sizeof (T),其中T 是目标类型减去*。所以如果你分配给char **,它就是sizeof(char *)

【讨论】:

  • 更好的方法是使用实​​际(取消引用)变量而不是类型,例如sizeof *cleanList,这样它总是正确的。
  • @Someprogrammerdude 很多变化,还有sizeof cleanList[0]
  • 我已将 char** 的大小分别更改为 sizeof(char*) 和 char* 的 sizeof(char) ,但我遇到了同样的问题!程序运行然后崩溃
  • 你确定calloc(10,CHARLEN)足够大吗?为什么不calloc(sizeof(dirtyList[i])+1, CHARLEN)
  • 如果不是这样,那么是时候在调试器中单步调试程序了,这样您就可以看到出错时发生了什么。
猜你喜欢
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2016-02-05
相关资源
最近更新 更多