【问题标题】:Array function removes first char from the array数组函数从数组中删除第一个字符
【发布时间】:2012-02-27 17:24:53
【问题描述】:

我正在尝试为一个更大的项目编写一个函数,该项目包括使用字符数组。我正在处理的当前功能应该只保存字母字符并删除任何特殊字符(例如:!#@$?)和空格。我当前的函数有效,但由于某种原因,当我运行它时,总是删除数组的第一个字符。为什么会这样,我怎样才能让它保存第一个字符呢?

#include <stdio.h>

int main(void)
{
  char phrase[101];

  printf("Enter a phrase to change:");
  fgets(phrase, 101, stdin);

  printf("original phrase: %s", phrase);

  int i = 0, j = 0;
  while(phrase[i] != '\0')
  {
    if( ('A' <= phrase[i] && phrase[i] >= 'Z') || 
        ('a' <= phrase[i] && phrase[i] >= 'z') )
    {
       phrase[j] = phrase[i];
       i++;
       j++;
    }
    else
      i++;

    phrase[j] = '\0';
  }

  printf("new phrase: %s\n", phrase);

  return 0;
}

【问题讨论】:

    标签: c arrays function character


    【解决方案1】:

    您的比较运算符的方向是错误的。而不是:

    if( ('A' <= phrase[i] && phrase[i] >= 'Z') || 
        ('a' <= phrase[i] && phrase[i] >= 'z') )
    

    你需要:

    if( ('A' <= phrase[i] && phrase[i] <= 'Z') || 
        ('a' <= phrase[i] && phrase[i] <= 'z') )
    

    你写它的方式会跳过大写字母,这可能是它跳过你输入的第一个字符的原因。

    您还应该将phrase[j] = '\0'; 行移到循环之后,否则您可能会覆盖下一个要读取的字符。

    【讨论】:

      【解决方案2】:

      嗯,我猜第一个字符不是字母数字。您有一行专门删除它:

      phrase[j] = '\0';
      

      要么删除第一个字符(如果它不是字母数字),要么删除第二个字符(如果第一个字母数字)。

      只有在你扫描完你的字符串之后,你才应该在后面加上 \0。

      编辑:正如@interjay 指出的那样,您的检查是错误的,因此您的第一个字符总是 被视为不是字母数字。这就是你删除它的原因。

      【讨论】:

      • 是的,我发现一旦切换检查,就必须将其置于循环之外,否则我将无法获得正确的输出。谢谢!
      【解决方案3】:

      我猜是因为你的第一个字符是唯一的大写字符,你的逻辑是错误的。

      if( ('A' <= phrase[i] && phrase[i] >= 'Z') ||    
           ('a' <= phrase[i] && phrase[i] >= 'z') )     
      

      应该是

      if( ('A' <= phrase[i] && phrase[i] <= 'Z') ||    
           ('a' <= phrase[i] && phrase[i] <= 'z') )     
      

      虽然 C 库确实提供了 isalpha,但它也适用于 'A' 到 'Z' 不连续的 EBCDIC 字符集。

      【讨论】:

        【解决方案4】:

        使用ctype.h 中的isalpha() 怎么样?

        if (isalpha(phrase[i])) {
            phrase[j] = phrase[i];
            /* ... */
        }
        

        但要谈谈你的问题:

        while 循环只被访问一次,因为循环的谓词在第一次执行后不满足,因为你在第一次运行循环时将phrase[j] 设置为'\0'

        编辑:哦,我没有仔细阅读if 条件。正如@interjay 指出的那样,也是错误的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-08
          • 1970-01-01
          • 2013-03-02
          • 2017-02-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多