【问题标题】:How to loop through an array of strings, compare each string to a char string in c如何遍历字符串数组,将每个字符串与c中的char字符串进行比较
【发布时间】:2020-08-14 00:31:55
【问题描述】:

这是我循环遍历字符串数组的尝试。

我创建了一个 id 数组, 将每个 id 与从控制台读取的 voterID 进行比较。

// helper function
int verifyVoterID(char *uidDB[], char *voterID)
{
  for (int i = 0; i < sizeof(uidDB[0]); i++)
  {
    if (uidDB[0][i] == voterID)
      return 0;
  }
  return 1;
}

int main()
{
  char *uidDB[] = {"001", "002", "003"}, *voterID;
  
  printf("\n\nEnter ID: ");
  scanf("%s", voterID);

  // Verify voter's ID
  if (voterID)
    verifyVoterID(uidDB, voterID) == 0 
    ? doSomthing() 
    : doSomethingElse();

  return 0;
}

输出:

./03.c: In function 'verifyVoterID':
./03.c:19:21: warning: comparison between pointer and integer
   19 |     if (uidDB[0][i] == voterID)
      |

我也试过用strcmp()来比较

int verifyVoterID(char *uidDB[], char *voterID)
{
  for (int i = 0; i < sizeof(uidDB[0]); i++)
  {
    if (strcmp(uidDB[0][i], voterID) == 0)
      return 0;
  }
  return 1;
}

输出:

./03.c: In function 'verifyVoterID':
./03.c:19:24: warning: passing argument 1 of 'strcmp' makes pointer from integer without a cast [-Wint-conversion]
   19 |     if (strcmp(uidDB[0][i], voterID) == 0)
      |                ~~~~~~~~^~~
      |                        |
      |                        char

我错过了什么?

【问题讨论】:

  • 您需要strcmp(uidDB[i], voterID)。此外,您需要传入数组的大小。 sizeof(uidB[0]) 给出了 char * 的大小,这不是我们想要的。
  • @kaylum 感谢您的回复。请你更清楚一点,我是c的新手。我尝试使用sizeof(uidDB[0])(sizeof(uidDB) / sizeof(uidDB[0])) 获取数组的长度。我分别得到43。但是在 helper function 中使用第二个实例我得到另一个错误:
  • @kaylum ./03.c: In function 'verifyVoterID': ./03.c:16:30: warning: 'sizeof' on array function parameter uidDB' will return size of 'char **' [-Wsizeof-array-argumen ] 16 | for (int i = 0; i &lt; (sizeof(uidDB) / sizeof(uidDB[0])); i++) | ^ ./03.c:13:25: note: declared here 13 | int verifyVoterID(char *uidDB[], char *voterID) | ~~~~~~^~~~~~~
  • 您无法计算从函数内部传递给函数的数组的大小。需要在调用者中获取大小并将其传递给函数。 How do you get the size of array that is passed into the function?

标签: arrays c for-loop


【解决方案1】:

在我看来,有很多东西需要修改,我将发布以下代码和一些 cmets。我希望这可以帮助你。在VS2019上测试过。

// return 0 if uidDB[i]==voterID, -1 if no match found
// I added const keyword since we're not going to change uidDB or voiterID in the function(read-only)
int verifyVoterID(const char* uidDB[], int uidLen, const char* voterID)
{
    for (int i = 0; i < uidLen; ++i)
    {
        if (!strcmp(uidDB[i], voterID)) // same as strcmp()==0.
            return 0;
    }
    return (-1);
}

int main(void)
{
    char voterID[8];    // NOT char* voterID;
    printf("\n\nEnter ID: ");
    scanf("%3s", voterID);  // read 3 characters only.

    const char* uidDB[] = { "001", "002", "003" };  // must be array of const char*
    const int uidDBLen = (sizeof(uidDB) / sizeof(uidDB[0])); // practical way to cal. size of array
    int verify_res = verifyVoterID(uidDB, uidDBLen, voterID);   // always pass the size of array together with the array

    if (verify_res == 0)
        doSomething();  // verify success
    else
        doSomethingElse(); // fail

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多