我正在学习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;
}
例如,输入字符串&#34; a_long_time_ago ___ in_a_galaxy__far ____,_ far_away ..&#34;会产生&#34; a_long_time_ago_in_a_galaxy_far _,_ far_away ..&#34;
对于替换算法,我认为可能的一种可能性是存储空间的位置,然后通过辅助数组删除主数组中的空格。
我确信我犯了一些错误。另外,您认为如何优化代码?
提前谢谢。
答案 0 :(得分:1)
它不是代码审查,但是代码有几个明显的问题:
mainArray[i]=getchar();
- 你还没有初始化i,所以你正在写一些随机内存地址,可能你是在调试模式下编译,编译器将变量设置为0,但一般情况下 - 不要这样做
if (i < DIM)
- 您不需要i
,因为循环后会指向\n
之后的下一个符号,或者它将等于DIM-1, so just
mainArray [i] ='\ 0';`就够了
auxArray[m]=i;
- m未初始化
for (i=0 ; i < m ; ++i)
我无法理解这个循环的逻辑,特别是mainArray[n]=mainArray[n+1];
- 你没有改变n
。删除至少一个空格序列后,存储空间索引的整个方法是错误的 - 数组中的所有索引都是错误的。
这里有一个不同的版本,只有一个数组:
#include <stdio.h>
#include <string.h>
#define DIM 100
int main(int argc, char **argv)
{
char mainArray [DIM]={'\0'};
int i, j, k;
printf("Enter a string containing two or more consecutive spaces:\n");
fgets(mainArray, DIM, stdin); // note: last symbols of the array will be \n\0
mainArray[strlen(mainArray)-1] = '\0'; // trimming \n
printf("[%s]\n", mainArray);
for (i=0; mainArray[i] != '\0' ; ++i) {
if (mainArray[i] == ' ') {
for (j=(i+1); mainArray[j]==' '; ++j) ; // calculate end of space sequence, j will point to the first non space symbol
for (k=j; mainArray[k]!='\0'; ++k) // copy rest of string to the position after first space
mainArray[i+1+(k-j)] = mainArray[k];
mainArray[i+1+(k-j)] = '\0'; // put null-terminator
}
}
printf("[%s]\n", mainArray);
return 0;
}
答案 1 :(得分:0)
这是另一种仅使用char*
指针的方式:
#include <stdio.h>
#include <string.h>
int
main(void)
{
char *lhs;
const char *rhs;
int chr;
char mainArray[500];
fgets(mainArray,sizeof(mainArray),stdin);
lhs = strchr(mainArray,'\n');
if (lhs != NULL)
*lhs = 0;
printf("INP: '%s'\n",mainArray);
lhs = mainArray;
rhs = mainArray;
for (chr = *rhs++; chr != 0; chr = *rhs++) {
*lhs++ = chr;
if (chr != ' ')
continue;
for (chr = *rhs; chr != 0; chr = *++rhs) {
if (chr != ' ')
break;
}
}
*lhs = 0;
printf("OUT: '%s'\n",mainArray);
return 0;
}
更新:以上重新编码使用索引。请注意,没有好的效果会更加冗长。但是,逻辑仍然很简单。这是要点之一。为了将来参考,保持您的逻辑尽可能简单是重要的 - 并且没有更简单的&#34;因为当项目增长时,效果会因善恶而放大。
#include <stdio.h>
#include <string.h>
int
main(void)
{
char *cp;
int lhs;
int rhs;
int chr;
char mainArray[500];
fgets(mainArray,sizeof(mainArray),stdin);
cp = strchr(mainArray,'\n');
if (cp != NULL)
*cp = 0;
printf("INP: '%s'\n",mainArray);
lhs = 0;
rhs = 0;
for (chr = mainArray[rhs++]; chr != 0; chr = mainArray[rhs++]) {
mainArray[lhs++] = chr;
if (chr != ' ')
continue;
for (chr = mainArray[rhs]; chr != 0; chr = mainArray[++rhs]) {
if (chr != ' ')
break;
}
}
mainArray[lhs] = 0;
printf("OUT: '%s'\n",mainArray);
return 0;
}
另外,请在此处查看我的回答:Issue implementing dynamic array of structures
关于结构数组[可能看起来有点高级]但只是假装partition
类型是typedef int partition
或typedef char partition
。另外,请参阅有关int数组和指针可以互换的最后一部分。