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