为什么这个pangram计划没有提供正确的答案?

时间:2015-12-23 13:18:19

标签: c

请帮我在此代码中找到错误。 并告诉我如何从字符数组/字符串中删除特定字符(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");

2 个答案:

答案 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)

  1. scanf with&#34;%s&#34;确实停止阅读第一个空白。因为您还不需要格式化阅读,请改用fgets()(或将格式代码更改为允许空白的内容,例如&#34;%[^ \ n]&#34 ;,仅在返回时停止)

  2. 由于for循环中的条件,它在第一个空白处结束。您应该测试循环内的空白并绕过处理它,但仍然保持循环运行 - 编码方式,整个循环在找到时结束。