2012-02-27 57 views
0

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

#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

比较运算符的方向是错误的。相反的:

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

+0

你把它钉在头上,简单修复,谢谢!:) – Ryan 2012-02-27 17:53:58

2

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

phrase[j] = '\0'; 

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

只有在完成扫描字符串后,才应该放置尾部\ 0。

编辑:@interjay指出,你的检查是错误的,所以你的第一个字符是总是对待为不字母数字。这就是为什么你抹去它。

+0

是的,我发现一旦我切换我的支票是必要的,有循环之外,其他明智我不会得到正确的输出。谢谢! – Ryan 2012-02-27 17:54:56

0

如何使用ctype.hisalpha()

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

但谈论你的问题:

while循环只去过一次,因为循环的谓语是第一次执行后不能满足,因为你在设置phrase[j]'\0'循环第一次运行。

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

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这也将在EBCDIC字符集,其中 'A' 到 'Z' 是不连续的工作。