Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c中正确更改char[]中的元素_C - Fatal编程技术网

如何在c中正确更改char[]中的元素

如何在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

我试图创建一个函数,从文件中接收word,然后通过删除任何标点或引号来规范化它。我遇到的问题是,当我有一个词在前面或前面和后面都有,就像怎么说的,我会这样说:

"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我可以从这样的代码中学到更多,而不仅仅是一行答案。