我该如何修复我的C程序?

时间:2013-07-27 17:06:09

标签: c

我以为我修复了我的代码所以删除了我的旧帖子。我的问题是试图确定我的代码有什么问题。我正在测试一个字符串,看它是否符合两个条件。它必须只包含字母字符和至少一个元音。我从哪里开始?

int check_word(char);

main()
{
   char array[100];
   int result;

   printf("Enter a word:\n");
   gets(array);

   check_word(array);
   {
   if result == 1;
   printf("Word is valid\n");

   else
       printf ("Word is notvalid.");
   }
   return 0;
}



int check_word(char a)
{
   if ( a >= 'A' && a <= 'Z' )
      a = a + 'a' - 'A';   /* Converting to lower case */

   if ( (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u') && (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) 
      result = 1;
   else 
       result = 0;

   return result;
}

4 个答案:

答案 0 :(得分:8)

以下是您可能想要查看的一些内容:

  • isalpha
  • The C switch statement
  • 数组与单个变量之间的区别。
  • C中的字符串(实际上是一个字符串数组,终止为0)
  • 返回值的工作原理

编辑:这是一个小练习:“填补差距”

使用语义正确的语句填充每个空格...解释(即推理)为什么你必须在那里写那个具体的陈述。

#include <...>
#include <...>

int is_vowel(int c)
{
    switch(c) {
    case 'a':
    case 'A':
    case 'e':
    ...
        return ...;
    }
    return ...;
}

int justalpha_hasvowel(... candidate)
{
    if(!candidate)
        return ...;

    int found_vowel = 0;
    for(char *c = candidate; *c; ...) {
        if(!isalpha(*c))
            return 0;
        found_vowel = is_vowel(*c) || ...;
    }
    return found_vowel;
}

... main(...)
{
   char array[100];
   int result;

   printf("Enter a word:\n");
   memset(array, 0, sizeof(array));
   fgets(array, sizeof(array)-1, stdin);

   ... = justalpha_hasvowel(array);
   if(...) {
       printf("Word is valid\n");
   } else {
       printf ("Word is not valid.");
   }
   return 0;
}

答案 1 :(得分:2)

很多问题:

int check_word(char);

main() /* int main(void) is better */
{
   char array[100];
   int result;

   printf("Enter a word:\n");
   gets(array); /* deprecated, use fgets(array, sizeof(array), stdin) */

   /* check_word(array);  Do you want to check the first character or the whole string? */
   result = check_word(array[0]); /* the first character */
   /* if result == 1; Nops */
   if (result == 1) 
       printf("Word is valid\n");
   else
       printf ("Word is notvalid."); /* what about \n :) ? */

   return 0;
}

int check_word(char a)
{
   if ( a >= 'A' && a <= 'Z' )
      a = a + 'a' - 'A'; /* suggest tolower() */
   /* c is not initialized --------------------------------------------v */
   /* suggest parentheses around ‘&&’ within ‘||’ */
   if ( (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u') && (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
   /* or delete all this stuff  -------------------------------------^ from here */
      /*result = 1;*/ return 1;
   else 
      /* result = 0; */ return 0;

   /* return result; */
}

答案 2 :(得分:1)

 check_word(array);
   {
   if result == 1;
   printf("Word is valid\n");

   else
       printf ("Word is notvalid.");
   }

这些代码毫无意义。请使用:

result = check_work(array);
if(result == 1)
    printf("Word is valid\n");
else 
    printf("Word id notValid\n");

另外,在功能int result ;的开头添加check_word

你应该知道:

1. result中的main不是result中的check_word

2. if(result ==1) ;表示在(result == 1) == true

时不执行任何操作

答案 3 :(得分:1)

有几个问题。

  1. 绝不永远不要使用gets ; 在您的代码中引入故障点和主要安全漏洞。自2011 C标准起不再支持。请改用fgets

  2. 自1999年标准以来,不再支持main的隐式输入;请改用int main( void )

  3. 您已声明check_word取一个char值作为参数,但您传递的是char数组,这意味着它收到char * 1 。基于函数的主体,看起来您只想传递一个字符,因此您将其称为
    
        if ( check_word( array[0] ) == 1 )
        {
          printf( "word is valid\n" );
        }
    

  4. 有许多库函数可以使`check_word`函数更简单:isupper()返回true,字符值为大写,tolower()将字符值从大写转换为小写,{{如果字符是字母等,则返回true。您需要isalpha()才能使用这些函数。

  5. 您可能希望将元音检查分解为自己的功能,如下所示:
    #include <ctype.h>
    然后在 int vowel( int c ) { int lc = tolower( c ); return ( lc == 'a' || lc == 'e' || lc == 'i' || lc == 'o' || lc == 'u' ); } 函数中使用它
    check_word
    我假设 if ( vowel( a ) && ...) { result = 1; } 中的c是拼写错误,您打算输入(c >= 'a' && c <='z')。同样,这是a库函数派上用场的地方:
    isaplha

<小时/> 1。除非它是 if ( vowel( a ) && islapha( a ) ) { result = 1; } 或一元sizeof运算符的操作数,或者是用于在声明中初始化数组的字符串文字,否则表达式为“N元素数组{{1 “将转换为类型为”&指针“的表达式,表达式的值将是数组中第一个元素的地址。

相关问题