我正在使用指向字符数组的指针。这段代码应该切换字母的大小写,删除数字,打印两个空格而不是一个,并以相同的方式打印所有其他字符。除了打印其他字符相同之外,其余所有操作都很好。这看起来应该不是问题,但我无法弄清楚。看到任何看起来不对的地方吗?
void compareDuplicates(FILE * ifp, char mode){
/* size MAXCHARS+1 to hold full array + null terminate*/
char newArray [MAXCHARS +1] = {0};
char oldArray [MAXCHARS +1] = {0};
char * newStr = newArray;
char * oldStr = oldArray;
char * tempStr;
/* fill array, test for EOF*/
while(fgets(newStr,MAXCHARS, ifp)){
//if strings are the same, do not print anything
if(strcmp(newStr, oldStr) !=0){
//else print
testStrings(newStr);
}
//set oldStr pointer to newStr, set newStr pointer to oldStr reset newStr memory
//reset memory of newStr to all null chars
tempStr = oldStr;
oldStr = newStr;
newStr = tempStr;
memset(newStr,'\0',MAXCHARS);
}
}
void testStrings(char * array1){
int i = 0;
char c;
while(*(array1+i) != '\0'){
if(*(array1+i) >= 'A' && *(array1+i) <= 'Z'){
c = *(array1+i)+32;
printf("%c",c);
}
else if(*(array1+i) >= 'a' && *(array1+i) <='z'){
c = *(array1+i)-32;
printf("%c",c);
}
else if(*(array1+i) == ' '){
c = *(array1+i);
printf("%c",c);
printf("%c",c);
}
else if(*(array1+i) >= '0' || *(array1+i) <= '9'){
i++;
continue;
}
else{
c = *(array1+i);
printf("%c",c);
}
i++;
}
printf("\n");
}
例如,如果给出以下行:
CONSECUTIVE_LINE
CONSECUTIVE_LINE
CONSECUTIVE_LINE
123 REPEAT
123 REPEAT
232unique-line
输出将是:
consecutiveline
repeat
UNIQUELINE
表示连续行的删除、大小写的改变、一处加两个空格、数字的删除。但是,它不会打印正常的下划线和其他非目标字符。
最佳答案
本次测试...
*(array1+i) >= '0' || *(array1+i) <= '9'
...将始终产生 true。您检查的任何字符都将超过 '0'
或小于'9'
因为'0' < '9'
。您可能想检查一个字符是否在此范围内,这需要 &&
(逻辑与),就像您在所有其他操作中所做的那样。
顺便说一句,不要假设字符编码会将字母字符按顺序排列。仅保证数字字符为真。更好的检查将利用 isalpha
和 islower
或 isupper
来自标准库的ctype.h
header 。
关于c - Else 子句不执行 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50111394/