我需要编写一个代码,该代码读取一个字符串,并将小于'm'的字符串中的字母放入一个称为first的数组中,将'm'或更大的字母放入一个名为持续。当遇到非小写字母时,只需跳过它并移至下一个字母即可。
我的代码仅在字符串中使用非小写字母时有效,而在涉及数字和符号时则无效。
#include<stdio.h>
// main function
int main(void){
// declare strings
char letters[20], first[20], last[20];
// read in a lower-case string
printf("enter letters: ");
scanf("%19s",letters); //the number %19s limits the string to being
//19 characters long (plus the null character)
// setup indexes to track current index of arrays.
int letters_index, first_index, last_index;
letters_index=0;
first_index=0;
last_index=0;
char curr_letter ;
// loop and split
while(letters[letters_index] != 0) { // not null
switch (letters[letters_index]){
case 97 ... 122:
curr_letter = letters[letters_index];
// less than 'm'?
if(curr_letter < 'm'){
// add to first
first[first_index]=curr_letter;
first_index++;
} else {
// otherwise, add to last
last[last_index]=curr_letter;
last_index++;
}
letters_index++;
break;
}
}
// now add nulls
first[first_index]='\0';
last[last_index]='\0';
// print arrays
printf("first: %s\n",first);
printf("last: %s\n",last);
}
如果输入为hell2o,则输出应为first:hell;最后:o
答案 0 :(得分:2)
仅当输入匹配letters_index
时,您的代码才会递增case 97 ... 122:
。如果发现不匹配的字符,则会无休止地循环。
将递增的letters_index++;
从switch{}
中移到while
循环的末尾。
与错误无关:您应该使用相应的字符常量97
和122
或库函数{{1},而不是数字'a'
和'z'
}。
修改后的代码:
islower()
答案 1 :(得分:1)
仅当字符介于Image.gz
和'a'
之间时,您才增加计数器,结果您将陷入无限循环,请将计数器移到'z'
之外:
switch
另一方面,请勿使用像97和122这样的幻数:
while(letters[letters_index] != 0) { // not null
switch (letters[letters_index]){
case 97 ... 122:
curr_letter = letters[letters_index];
// less than 'm'?
if(curr_letter < 'm'){
// add to first
first[first_index]=curr_letter;
first_index++;
} else {
// otherwise, add to last
last[last_index]=curr_letter;
last_index++;
}
// letters_index++; --> Not here
break;
}
letters_index++; // --> Here
}