如何在c中正确更改char[]中的元素
我试图创建一个函数,从文件中接收word,然后通过删除任何标点或引号来规范化它。我遇到的问题是,当我有一个词在前面或前面和后面都有,就像怎么说的,我会这样说:如何在c中正确更改char[]中的元素,c,C,我试图创建一个函数,从文件中接收word,然后通过删除任何标点或引号来规范化它。我遇到的问题是,当我有一个词在前面或前面和后面都有,就像怎么说的,我会这样说: "howw" howwETX "well "wel 我该如何阻止这种情况发生 char *normalize( int count, char entry[], char output[] ){ count--;/* to allow for the zero index of an array*/ if( ent
"howw"
howwETX
"well
"wel
我该如何阻止这种情况发生
char *normalize( int count, char entry[], char output[] ){
count--;/* to allow for the zero index of an array*/
if( entry[0] == '"' && entry[count] == '"' ){
for(int i=1 , j=0;j < count - 1; i++,j++ ){
output[j] = entry[i];
}
output[count + 1 ] = '\0';
return output;
}else if( entry[0] == '"' ){
for(int i = 0 , j=0; j < count; i++, j++ ){
output[j] = entry[i];
}
output[count++] = '\0';
return output;
} else if( entry[count] == '"' || ispunct( entry[count] ) ){
for(int i=0 , j=0;i < count; i++,j++ ){
output[j] = entry[i];
}
output[count] = '\0';
return output;
}
return entry;
}/* ends normalize( int count, char entry[], char output[] )*/
你没有正确计算你的指数 在前面和后面都有引号的情况下,更新计数后,输出字符串的长度为count-1,因此应将输出[count-1]='\0'设置为output[count+1]='\0'。事实上,您可能希望在循环外贴花j并使用output[j],因为这在所有三种情况下都是字符串中的正确位置 如果只有第一个字符是引号,则应跳过引号:i=1,而不是i=0
让我们玩调试器。假设您的输入是:
entry == "a"
count == 3
我们开始执行,下面是发生的情况:
count == 2
i == 1
j == 0
output[0] == 'a'
循环退出,然后:
output[3] == '\0'
所以现在输出包含aa,这是不正确的。解决方案是在循环退出时将输出[count-1]设置为null,而不是count+1。尝试以下操作。至少它是正确的,而且看起来更简单
char * normalize( char output[], const char entry[], size_t n )
{
if ( n != 0 && entry[0] == '"' )
{
++entry;
--n;
}
if ( n != 0 && ispunct( entry[n-1] ) )
{
--n;
}
strncpy( output, entry, n );
output[n] = '\0';
return output;
}
建议:简化它。不要试图在同一时间查看多个字符,如开始和结束引号。相反,只需从头到尾循环并接受或拒绝单个字符。您不仅可以获得更简单、可读性更强的代码,而且很可能可以解决该bug。Loststudent1无法通过获得一个随时可用的解决方案来学习更多内容,该解决方案甚至可以尝试优化任务。我怀疑目标是得到最好的算法。其他答案确实教会了我们一些东西。@cornuz是我的答案教会了我们如何编写代码。所有其他答案都是无用的。@cornuz我可以从这样的代码中学到更多,而不仅仅是一行答案。