【问题标题】:Two functions working in isolation, but not together两个函数单独工作,但不能一起工作
【发布时间】:2014-10-28 18:35:02
【问题描述】:

我有两个函数 rmdup 和 rmvow,当我单独运行这些函数时,它们运行良好,但是当它们一起在一个程序中时,它们就完全不工作了?

int rmdup ( char name[] ) 
{

  char nodup[20] = {''\0''};
  int l = strlen(name);
  int i = 0, j, k = 0;

  while ( i < l ) 
  {
    j = i + 1;

    if ( name[i] == name[j] ) 
    {
      nodup[k] = name[i];
      i+2;
      while(nodup[k] == name[i]) 
      {
        i++;
      }
      k++;
    }
    else 
    {
      i++;
    }

    nodup[k] = ''\0'';
  }

  strcpy(name, nodup);
}

上面的工作是孤立的,下面的也是。

int rmvow ( char name[]  ) 
{
  char novow[20] = {''\0''};
  int l = strlen(name);
  int i = 0, j = 0;

  while ( i < l ) 
  {
    if ( name[i] == ''a'' || 
         name[i] == ''e'' ||
         name[i] == ''i'' ||
         name[i] == ''o'' ||
         name[i] == ''u'' ) 
    {
      i++;
    }
    else 
    {
      novow[j] = name[i];
      i++;
      j++;
    }

    novow[j] = ''\0'';
  }

  strcpy(name, novow);
}

【问题讨论】:

  • 请学会正确缩进你的代码。它使阅读和遵循执行流程变得更加容易。你还没有展示你是如何尝试“在一个程序中一起使用它们”的,那么我们应该如何解释它们为什么不起作用呢?
  • 不清楚您所说的“当他们在一起时”甚至是“他们根本不工作”是什么意思。提供一起使用它们的代码,说明每个应该的时间,以及实际结果。您的代码布局充其量是非常规的,并且很难阅读 - 如果您希望其他人阅读您的代码并提供帮助,您应该使其尽可能简单。
  • 这是什么语言,为什么标记为strcpy?这有关系吗?什么是''\0''''a'' 等?它们不会编译为 C 代码,否则看起来就是这样。
  • i+2 应该是i += 2
  • 该代码是“危险的”,因为它对于任何字符串长度都无法正常工作。就地修改字符串比使用固定长度的临时数组novownodup 更安全。

标签: strcpy


【解决方案1】:

正确且完整的代码如下输出:

aabbccddeeff
abcdef
bcdf

这似乎是正确的。唯一更正的是rmdup() 中的i += 2 和有效字符常量。在没有任何其他信息的情况下编译为 C 代码。

#include <stdio.h>
#include <string.h>

int rmdup ( char name[] ) ;
int rmvow ( char name[] ) ;

int main(void) 
{
    char test[] = "aabbccddeeff" ;

    printf( "%s\n", test ) ;
    rmdup( test ) ;

    printf( "%s\n", test ) ;
    rmvow( test ) ;

    printf( "%s\n", test ) ;

    return 0;
}

int rmdup ( char name[] ) 
{

  char nodup[20] = {'\0'};
  int l = strlen(name);
  int i = 0, j, k = 0;

  while ( i < l ) 
  {
    j = i + 1;

    if ( name[i] == name[j] ) 
    {
      nodup[k] = name[i];
      i+=2;
      while(nodup[k] == name[i]) 
      {
        i++;
      }
      k++;
    }
    else 
    {
      i++;
    }

    nodup[k] = '\0';
  }

  strcpy(name, nodup);
}

int rmvow ( char name[]  ) 
{
  char novow[20] = {'\0'};
  int l = strlen(name);
  int i = 0, j = 0;

  while ( i < l ) 
  {
    if ( name[i] == 'a' || 
         name[i] == 'e' ||
         name[i] == 'i' ||
         name[i] == 'o' ||
         name[i] == 'u' ) 
    {
      i++;
    }
    else 
    {
      novow[j] = name[i];
      i++;
      j++;
    }

    novow[j] = '\0';
  }

  strcpy(name, novow);
}

但是代码很危险,因为没有防止novownodup 数组溢出的保护措施。两者都是不必要的;在这两种情况下,您都可以将数据直接写回name,因为目标索引始终是

int rmdup ( char name[] ) 
{

  int l = strlen(name);
  int i = 0, j, k = 0;

  while ( i < l ) 
  {
    j = i + 1;

    if ( name[i] == name[j] ) 
    {
      name[k] = name[i];
      i+=2;
      while(name[k] == name[i]) 
      {
        i++;
      }
      k++;
    }
    else 
    {
      i++;
    }

    name[k] = '\0';
  }
}

int rmvow ( char name[]  ) 
{
  int l = strlen(name);
  int i = 0, j = 0;

  while ( i < l ) 
  {
    if ( name[i] == 'a' || 
         name[i] == 'e' ||
         name[i] == 'i' ||
         name[i] == 'o' ||
         name[i] == 'u' ) 
    {
      i++;
    }
    else 
    {
      name[j] = name[i];
      i++;
      j++;
    }

    name[j] = '\0';
  }
}

【讨论】:

  • @ElisJones :由于您没有努力澄清问题,我真的很遗憾即使试图诚实地回答。
  • 对不起?我试图编写一个程序“Soundex”,从字符串中删除元音和重复,然后对剩余的字母进行编码。例如,Clifford -> Clffrd -> Cllfrd -> C1432。
猜你喜欢
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
相关资源
最近更新 更多