【发布时间】: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()提供了错误的参数