Delete/substitute 字符数组中的两个或多个连续字符
Delete/substitute two or more consecutive chars in array of chars
我正在学习 C 并且必须编写一个程序:
- 从标准输入中读取一定数量的字符并将它们存储在数组中;
- 用任意两个或多个连续空格 (' ') 替换一个;
- 写回数组。
到目前为止,我已经完成了以下工作:
#include <stdio.h>
#define DIM 100
int main(int argc, char **argv)
{
char mainArray [DIM]={'[=11=]'};
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 '[=11=]' */
if (i < DIM)
mainArray[i]='[=11=]';
else
mainArray[DIM-1]='[=11=]';
l=i;
/* My substitution algorithm */
for (i=0 ; mainArray[i] != '[=11=]' ; ++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] != '[=11=]' ; ++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.."
替换算法我认为一种可能是将多余的空格位置存起来,然后通过辅助数组删除主数组中的空格
我确定我犯了一些业余错误。另外,您认为代码应该如何优化?
提前致谢。
这不是代码审查,但您的代码有几个明显的问题:
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
。存储 spaces 索引的整个方法是错误的,在删除至少一个 space 序列后 - 数组中的所有索引都变成了错误的索引。
这里有一点不同的版本,只有一个数组:
#include <stdio.h>
#include <string.h>
#define DIM 100
int main(int argc, char **argv)
{
char mainArray [DIM]={'[=10=]'};
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[=10=]
mainArray[strlen(mainArray)-1] = '[=10=]'; // trimming \n
printf("[%s]\n", mainArray);
for (i=0; mainArray[i] != '[=10=]' ; ++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]!='[=10=]'; ++k) // copy rest of string to the position after first space
mainArray[i+1+(k-j)] = mainArray[k];
mainArray[i+1+(k-j)] = '[=10=]'; // put null-terminator
}
}
printf("[%s]\n", mainArray);
return 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;
}
更新: 上面重新编码以使用索引。请注意,它更冗长没有什么好的效果。但是,逻辑仍然很简单。这是要点之一。为了将来参考,保持您的逻辑很重要 "as simple as possible--and no simpler",因为当项目增长时,无论是好是坏,效果都会被放大。
#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;
}
此外,请在此处查看我的回答:
它是关于结构数组的[这似乎有点高级]但只是假装 partition
类型是 typedef int partition
或 typedef char partition
。另外,请参阅关于 int 数组和指针可互换的最后一部分。
我正在学习 C 并且必须编写一个程序:
- 从标准输入中读取一定数量的字符并将它们存储在数组中;
- 用任意两个或多个连续空格 (' ') 替换一个;
- 写回数组。
到目前为止,我已经完成了以下工作:
#include <stdio.h>
#define DIM 100
int main(int argc, char **argv)
{
char mainArray [DIM]={'[=11=]'};
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 '[=11=]' */
if (i < DIM)
mainArray[i]='[=11=]';
else
mainArray[DIM-1]='[=11=]';
l=i;
/* My substitution algorithm */
for (i=0 ; mainArray[i] != '[=11=]' ; ++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] != '[=11=]' ; ++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.."
替换算法我认为一种可能是将多余的空格位置存起来,然后通过辅助数组删除主数组中的空格
我确定我犯了一些业余错误。另外,您认为代码应该如何优化?
提前致谢。
这不是代码审查,但您的代码有几个明显的问题:
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
。存储 spaces 索引的整个方法是错误的,在删除至少一个 space 序列后 - 数组中的所有索引都变成了错误的索引。
这里有一点不同的版本,只有一个数组:
#include <stdio.h>
#include <string.h>
#define DIM 100
int main(int argc, char **argv)
{
char mainArray [DIM]={'[=10=]'};
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[=10=]
mainArray[strlen(mainArray)-1] = '[=10=]'; // trimming \n
printf("[%s]\n", mainArray);
for (i=0; mainArray[i] != '[=10=]' ; ++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]!='[=10=]'; ++k) // copy rest of string to the position after first space
mainArray[i+1+(k-j)] = mainArray[k];
mainArray[i+1+(k-j)] = '[=10=]'; // put null-terminator
}
}
printf("[%s]\n", mainArray);
return 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;
}
更新: 上面重新编码以使用索引。请注意,它更冗长没有什么好的效果。但是,逻辑仍然很简单。这是要点之一。为了将来参考,保持您的逻辑很重要 "as simple as possible--and no simpler",因为当项目增长时,无论是好是坏,效果都会被放大。
#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;
}
此外,请在此处查看我的回答:
它是关于结构数组的[这似乎有点高级]但只是假装 partition
类型是 typedef int partition
或 typedef char partition
。另外,请参阅关于 int 数组和指针可互换的最后一部分。