【问题标题】:function help in CC中的函数帮助
【发布时间】:2014-05-09 11:24:24
【问题描述】:

我将多次重复使用此代码,所以我想使用它。功能。我不确定指针如何与此一起使用。我的目标是检查mneumonic 是否等于strings_label_table 中的任何值。如果mneumonic 等于我想设置string_equal_flag = 1 的值之一并返回它,如果没有设置return string_not_flag = 1; 并返回它。或者我可以从函数中设置它吗?这在我的主要工作中非常有效。

char *strings_label_table[503] = {0};
char *strings_mneumonic_table[503] = {0};
char mneumonic[20] = {0};

int hashLetter(char mneumonic)
            for(i = 0; i < 50; i++)
            {
                //printf(" i is %d \n", i);
                if(strings_label_table[i] != NULL)
                {
                    if(strcmp (strings_label_table[i], mneumonic) == 0)
                    {
                        printf(" strings_label_table[i] is equal\n");
                        printf(" strings_label_table[i] is %s \n", strings_label_table[i]);
                        //printf(" nam is %s \n", nam);
                        return string_equal_flag = 1;
                        break;
                    }
                    //printf(" Top if 2 \n");
                }
                if(i == 49)
                {
                    return string_not_flag = 1;
                    //printf(" set string_not_flag\n"); 
                }
            }

【问题讨论】:

  • 请尝试编译。似乎有一些类型不匹配。让您的编译器向您显示所有警告并处理它们。带上更正的代码回来。

标签: c arrays function pointers


【解决方案1】:

我试图了解您要使用此功能做什么。这些是我的 cmets:

 int hashLetter(const char *mneumonic) 
                    /* the func argument needs to be a char pointer,
                     * not just one char
                     */
 {
     for (int i = 0; i < 50; i++) {
         if (strings_label_table[i] != NULL) {
             if(strcmp (strings_label_table[i], mneumonic) == 0) {
                 printf(" strings_label_table[i] is equal\n");
                 printf(" strings_label_table[i] is %s \n", strings_label_table[i]);
                 //printf(" nam is %s \n", nam);
                 return string_equal_flag = 1;   /* returns 1 */
             }
             //printf(" Top if 2 \n");
         }
     }
     /* You can just return after the loop */
     return string_not_flag = 1;  /* returns 1 */
 }

注意,这个函数总是返回一个,所以返回值没有多大意义。还不如作废。

   return string_equal_flag = 1;
   /*  Is the same as */
   return (string_equal_flag = 1);

表达式string_equal_flag = 1 的计算结果为1

【讨论】:

    【解决方案2】:

    我在您的代码中看到以下问题。

    函数体

    函数体未正确定义。您需要在 {} 之间拥有函数体。

     int hashLetter(char mneumonic)
     {
        // Body of the function must be contained between the braces, {}.
     }
    

    函数的输入

    你有

    char mneumonic[20] = {0};
    

    在函数定义之上。该函数还有一个名为mneumonic 的参数,它是不同类型的。我认为您不需要函数定义之上的那个。我还认为,从您尝试在函数中使用它的方式来看,您可能意味着函数的参数类型为 char*const char*

    函数中的代码

    你有

    return string_equal_flag = 1;
    break;
    

    return 之后不需要break 语句。它永远不会被执行。此外,您无需额外分配即可重返工作岗位。您可以将这两行替换为:

    return 1;
    

    另外,你不需要块

    if(i == 49)
    {
        return string_not_flag = 1;
        //printf(" set string_not_flag\n"); 
    }
    

    如果for循环结束时你还没有从函数中返回,那么你就知道你没有找到助记符。您可以简单地返回 0。

    总而言之,函数可以简化成如下所示:

    int hashLetter(const char* mneumonic)
    {
       int i = 0;
       for(i = 0; i < 50; i++)
       {
          if(strings_label_table[i] != NULL)
          {
             if(strcmp (strings_label_table[i], mneumonic) == 0)
             {
                return 1;
             }
          }
       }
       return 0;
    }
    

    【讨论】:

      【解决方案3】:

      您的代码有一些问题会阻止其编译,我不确定我是否理解您要执行的操作。但是,如果您尝试使用记住的单词(例如“Sally”)来查找您尝试记住的单词(例如“减法”),例如“请原谅我亲爱的 Sally 阿姨”这样的助记符,那么这是一种方法实施它:

      实施

      #include <string.h>
      
      //Try not to hardcode values (like '50', '20', or '49')
      //Instead, put them into constants so if you ever change the value,
      //you won't accidentally miss any usages.
      const int WordSize = 32;
      
      //Values that belong together should stay together, preferably by putting them in a structure.
      typedef struct MnemonicWordStruct
      {
          char originalWord[32];
          char memorizedWord[32];
      } MnemonicWord;
      
      const char *GetWordFromMnemonic(const char *memorizedWord, MnemonicWord *mnemonicWords, int numMnemonicWords)
      { // Don't forget the opening bracket!
      
          //Iterate over each mnemonic work, looking for a match.
          int i;
          for(i = 0; i < numMnemonicWords; ++i)
          {
              //Compare this mnemonic's memorized word to the memorized word we passed into the function.
              if(strcmp(mnemonicWords[i].memorizedWord, memorizedWord) == 0)
              {
                  //If it matches, return the actual word.
                  return mnemonicWords[i].originalWord;
              }
          }
      
          //If we haven't found a match, return NULL.
          return NULL;
      }
      

      用法

      这是一个如何使用它的示例:

      int main()
      {
          const int NumMnemonicWords = 6;
          MnemonicWord mnemonicWords[6];
      
          strcpy(mnemonicWords[0].originalWord, "Paranthesis");
          strcpy(mnemonicWords[0].memorizedWord, "Please");
      
          strcpy(mnemonicWords[1].originalWord, "Exponents");
          strcpy(mnemonicWords[1].memorizedWord, "Excuse");
      
          strcpy(mnemonicWords[2].originalWord, "Multiplication");
          strcpy(mnemonicWords[2].memorizedWord, "My");
      
          strcpy(mnemonicWords[3].originalWord, "Division");
          strcpy(mnemonicWords[3].memorizedWord, "Dear");
      
          strcpy(mnemonicWords[4].originalWord, "Addition");
          strcpy(mnemonicWords[4].memorizedWord, "Aunt");
      
          strcpy(mnemonicWords[5].originalWord, "Subtraction");
          strcpy(mnemonicWords[5].memorizedWord, "Sally");
      
          int i;
          for(i = 0; i < NumMnemonicWords; ++i)
          {
              const char *lookup = mnemonicWords[i].memorizedWord;
              const char *answer = GetWordFromMnemonic(lookup, mnemonicWords, NumMnemonicWords);
              printf("%s = %s\n", lookup, answer);
          }
      
          return 0;
      }
      

      这是 Ideone.com 上的可编译、功能性代码,您可以在其中实际测试和使用它:

      Working code

      【讨论】:

        猜你喜欢
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 2011-03-14
        • 1970-01-01
        相关资源
        最近更新 更多