请帮我在此代码中找到错误。 并告诉我如何从字符数组/字符串中删除特定字符(e.x. a space)。 如果输入字符串是 "我们及时判断古董象牙扣为下一个奖项" 那么如何制作一个我必须像这样工作的字符数组 "我们很快就判断出了反对意见,但是很难说出来了。"
谢谢!!
int a[26] = {0};
int c = 0;
char* str = (char *)malloc(1000 * sizeof(char));
scanf("%s", str);
for( int i = 0; str[i]!= '\0' && str[i]!= ' ' ; i++) {
if( str[i] == 'a' || str[i] == 'A') {
a[0]++;
};
if( str[i] == 'b' || str[i] == 'B') {
a[1]++;
};
if( str[i] == 'c' || str[i] == 'C') {
a[2]++;
};
if( str[i] == 'd' || str[i] == 'D') {
a[3]++;
};
if( str[i] == 'e' || str[i] == 'E') {
a[4]++;
};
if( str[i] == 'f' || str[i] == 'F') {
a[5]++;
};
if( str[i] == 'g' || str[i] == 'G') {
a[6]++;
};
if( str[i] == 'h' || str[i] == 'H') {
a[7]++;
};
if( str[i] == 'i' || str[i] == 'I') {
a[8]++;
};
if( str[i] == 'j' || str[i] == 'J') {
a[9]++;
};
if( str[i] == 'K' || str[i] == 'k') {
a[10]++;
};
if( str[i] == 'l' || str[i] == 'L') {
a[11]++;
};
if( str[i] == 'm' || str[i] == 'M') {
a[12]++;
};
if( str[i] == 'n' || str[i] == 'N') {
a[13]++;
};
if( str[i] == 'o' || str[i] == 'O') {
a[14]++;
};
if( str[i] == 'p' || str[i] == 'P') {
a[15]++;
};
if( str[i] == 'q' || str[i] == 'Q') {
a[16]++;
};
if( str[i] == 'r' || str[i] == 'R') {
a[17]++;
};
if( str[i] == 's' || str[i] == 'S') {
a[18]++;
};
if( str[i] == 't' || str[i] == 'T') {
a[19]++;
};
if( str[i] == 'u' || str[i] == 'U') {
a[20]++;
};
if( str[i] == 'v' || str[i] == 'V') {
a[21]++;
};
if( str[i] == 'w' || str[i] == 'W') {
a[22]++;
};
if( str[i] == 'x' || str[i] == 'X') {
a[23]++;
};
if( str[i] == 'y' || str[i] == 'Y') {
a[24]++;
};
if( str[i] == 'z' || str[i] == 'Z') {
a[25]++;
};
};
for( int a0 = 0; a0 < 26; a0++) {
if( a[a0] > 0 ) c++;
};
if( c == 26 ) printf("pangram");
else printf("not pangram");
答案 0 :(得分:2)
使用fgets()
读取输入,因为它将读取输入的行。 scanf("%s", str);
只会使用"We"
等输入保存" We promptly ..."
。
if (fgetc(str, 1000, stdin)) {
// drop test for ' '
// for( int i = 0; str[i]!= '\0' && str[i]!= ' ' ; i++) {
for(int i = 0; str[i]; i++) {
....
}
// To only print letters
for(int i = 0; str[i]; i++) {
if (isalpha(str[i]) fputc(str[i], stdout);
}
fputc('\n', stdout);
在另一个问题上:重复的26次测试当然可以简化。
#include <ctype.h>
if (isalpha((unsigned char) str[i])) {
size_t index = toupper((unsigned char) str[i]) - 'A';
a[index]++;
}
或便携式
#include <ctype.h>
const char AZ[]= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *p = strchr(AZ, toupper((unsigned char) str[i]));
if (p && *p) {
a[p-AZ]++;
}
或其他各种方案。
答案 1 :(得分:0)
scanf with&#34;%s&#34;确实停止阅读第一个空白。因为您还不需要格式化阅读,请改用fgets()(或将格式代码更改为允许空白的内容,例如&#34;%[^ \ n]&#34 ;,仅在返回时停止)
由于for循环中的条件,它在第一个空白处结束。您应该测试循环内的空白并绕过处理它,但仍然保持循环运行 - 编码方式,整个循环在找到时结束。