atoi() 不适用于 char 数组

atoi() not working with char array

我正在学习 C,我正在尝试查找我用 char 数组创建的数据库有多少东西。

我知道 atoi 与字符串一起使用,但我无法理解字符串和字符数组声明之间的区别(我知道字符串也有带有 '/0' 的字符)。

编译时产生警告 [Warning] initialization makes integer from pointer without a cast 在行 int w = LoggersID[j];

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

int main()
{
    // Logger ID Database
    char LoggersID[50][2];
    strcpy(LoggersID[1], "A");
    strcpy(LoggersID[2], "B");
    strcpy(LoggersID[3], "C");
    strcpy(LoggersID[4], "D");
    strcpy(LoggersID[5], "E");
    strcpy(LoggersID[6], "F");
    strcpy(LoggersID[7], "G");
    strcpy(LoggersID[8], "H");
    strcpy(LoggersID[9], "I");
    strcpy(LoggersID[10], "J");
    strcpy(LoggersID[11], "K");
    strcpy(LoggersID[12], "L");
    strcpy(LoggersID[13], "M");
    strcpy(LoggersID[14], "N");
    strcpy(LoggersID[15], "O");
    strcpy(LoggersID[16], "P");
    strcpy(LoggersID[17], "Q");
    strcpy(LoggersID[18], "R");
    strcpy(LoggersID[19], "S");
    strcpy(LoggersID[10], "T");
    strcpy(LoggersID[21], "1");
    strcpy(LoggersID[22], "2");
    strcpy(LoggersID[23], "3");
    strcpy(LoggersID[24], "4");
    strcpy(LoggersID[25], "5");
    strcpy(LoggersID[26], "6");
    strcpy(LoggersID[27], "7");
    strcpy(LoggersID[28], "8");
    strcpy(LoggersID[29], "9");
    strcpy(LoggersID[30], "10");


    printf("Lets start!\n");


    for (int i = 65; i < 86; i++)
    {
        for (int j = 1; j < 31; j++)
        {
            int w = atoi(LoggersID[j]);
            if (w == i)
            {
                printf("\nYou matched %s with %d", LoggersID[j], i);
            }
        }
    }

    for (int i = 1; i < 11; i++)
    {
        for (int j = 1; j < 31; j++)
        {
            int w = LoggersID[j];
            if (w == i)
            {
                printf("\nYou matched %s with %d", LoggersID[j], i);
            }
        }
    }
    printf("\nProgram finished!");
    getchar();
    return 0;
}

当我 运行 我得到

Lets start!

Program finished!

而不是匹配!

atoi() 仅适用于字符串中的数字,如 "123"。它将 return 这个字符串的整数值。一旦它检测到 0-9 以外的任何字符,它就会终止该过程。所以在循环中,您不会检查值 1 到 10。

  int w = atoi(LoggersID[j]);
        if (w == i)

所以它没有打印任何东西。希望这有帮助。

有 3 个问题:


char LoggersID[50][2];替换为char LoggersID[50][3];

下一行将 3 个字符复制到 2 个字符的缓冲区中。由于 NUL 终止符,字符串文字 "10" 占用 3 个字符。

strcpy(LoggersID[30], "10");

int w = LoggersID[j];替换为int w = atoi(LoggersID[j]);

LoggersID[j]char*(指向 char 的指针)而不是 int,因此您需要将字符串转换为 int 使用atoi 函数。

这就是您收到警告 initialization makes integer from pointer without a cast at the line int w = LoggersID[j] 的原因。这个警告在大多数情况下实际上是一个错误。


你肯定有错别字:

strcpy(LoggersID[10], "T");替换为strcpy(LoggersID[20], "T");


顺便说一下,30 行 strcpy 可以替换为大约 6 行代码。

您的代码有一些问题:

  • 基于 C 的数组为 0:第一个元素位于偏移量 0。

  • 数组元素应至少有 3 个字符以容纳 2 个字符的字符串的空终止符,例如 "10".

  • 您可以使用数组的初始值设定项,而不是使用 strcpy().

  • 乏味地初始化元素
  • 将数组元素从字符串转换为数值的方法是调用 atoi()strtol() 将编码为数字的字符串转换为数字,或者读取值第一个字符的 int w = LoggersId[i][0];。将元素的地址转换为 int 是没有意义的。编译器发出警告:

    [Warning] initialization makes integer from pointer without a cast
        at the line int w = LoggersID[j];
    

    此类警告表示编程错误,应被视为致命警告。您可以配置编译器以帮助您在命令行上使用额外选项避免此类错误,例如 gcc -Wall -Werrorclang -Weverything -Werror

这是修改后的版本,您将在其中看到 2 种方法的匹配项:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    // Logger ID Database
    char LoggersID[30][3] = {
        "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
        "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
        "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
    };

    printf("Lets start!\n");
    for (int i = 1; i < 11; i++) {
        for (int j = 0; j < 30; j++) {
            int w = atoi(LoggersID[j]);
            if (w == i) {
                printf("You matched LoggersID[%d] = \"%s\" with %d\n",
                       j, LoggersID[j], i);
            }
        }
    }

    for (int i = 65; i < 85; i++) {
        for (int j = 0; j < 30; j++) {
            int w = LoggersID[j][0];
            if (w == i) {
                printf("You matched LoggersID[%d] = \"%s\" with %d (%c)\n",
                       j, LoggersID[j], i, i);
            }
        }
    }
    printf("\nProgram finished!");
    getchar();
    return 0;
}