Array函数从数组中删除第一个char

时间:2012-02-27 17:24:54

标签: c arrays function character

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

#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;
}

4 个答案:

答案 0 :(得分:4)

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

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';移动到,否则您可能会覆盖要读取的下一个字符。

答案 1 :(得分:2)

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

phrase[j] = '\0';

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

只有在完成扫描字符串后才能将尾部设置为0。

编辑:正如@interjay指出的那样,您的支票错误,因此您的第一个字符始终视为非字母数字。这就是你擦掉它的原因。

答案 2 :(得分: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') )     

尽管C库确实提供了isalpha,它也适用于“A”到“Z”不连续的EBCDIC字符集。

答案 3 :(得分:0)

如何使用isalpha()中的ctype.h

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

但要谈谈你的问题:

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

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