【发布时间】:2015-10-29 01:06:13
【问题描述】:
我正在学习 C 并且必须编写一个程序:
- 从标准输入读取一定数量的字符并将它们存储在一个数组中;
- 用任意两个或多个连续空格 (' ') 替换一个;
- 写回数组。
到目前为止,我已经完成了以下工作:
#include <stdio.h>
#define DIM 100
int main(int argc, char **argv)
{
char mainArray [DIM]={'\0'};
int auxArray [DIM];
int i, m, n, c, l;
printf("Enter a string containing two or more consecutive spaces:\n");
/* Read string from stdin */
do
{
mainArray[i]=getchar();
++i;
} while ((mainArray[i-1] != '\n') && (i < DIM-1));
/* Place the string terminator '\0' */
if (i < DIM)
mainArray[i]='\0';
else
mainArray[DIM-1]='\0';
l=i;
/* My substitution algorithm */
for (i=0 ; mainArray[i] != '\0' ; ++i)
{
if (mainArray[i] == ' ')
{
if (mainArray[i] == mainArray[i+1])
{
auxArray[m]=i;
++m;
}
}
}
for (i=0 ; i < m ; ++i)
{
for (c=auxArray[i] ; c < l-1 ; ++c)
mainArray[n]=mainArray[n+1];
}
/* Display the corrected string */
for (i=0 ; mainArray[i] != '\0' ; ++i)
printf("%c", mainArray[i]);
return 0;
}
例如,输入字符串“a_long_time_ago___in_a_galaxy__far____,_far_away..”将产生“a_long_time_ago_in_a_galaxy_far_,_far_away..”
对于替换算法,我认为一种可能是存储多余的空格位置,然后通过辅助数组删除主数组中的空格。
我确定我犯了一些业余错误。另外,您认为如何优化代码?
提前谢谢你。
【问题讨论】:
-
使用 2 个指针,使用一个指针(可能继续使用 for(i))遍历整个数组,然后复制到同一数组的另一个位置(调用此指针 J 并从 0 开始,起初它会复制自己)并有一个标志表明你找到了一个空间并在你找到另一个空间并且设置了标志时复制了它(第一个空间),只需“继续”i,但不要增加 j,直到找到复制到 *j 的非空格并继续遍历数组...不要忘记在最后一个 *j 位置添加空终止符...
-
@Ryu 谢谢!我也会尝试你建议的方法。
-
尝试习惯于使用
for对使用迭代变量的循环进行编码,并在其第一个表达式中声明迭代变量(带有初始化器)。 “重用”迭代变量是编码错误的平均来源。 (进一步简化似乎可能会丢弃不需要的空格字符而不是将它们写入(有限的)缓冲区 - 所呈现的分配要求否则,如果您无法消除规范的皱纹,最好按照字母进行。) -
@greybeard :“重用迭代变量”是什么意思?
-
永远不要在循环之后使用迭代变量,除了使用该值在一个地方处理提前和定期终止:如果您的下一次访问是读取,语言系统不会更好比正在初始化的变量,并且不能指向您丢失的初始化。一般来说,保持范围尽可能小,并且更喜欢暗示性的名称而不是简短的名称。 (在我看来,
i (j, k),以及使用 C、p和q(、s和d) 作为指针,强烈建议使用“迭代变量”。)
标签: c arrays string algorithm substitution