繁体   English   中英

atoi()无法与char数组一起使用

[英]atoi() not working with char array

我正在学习C,并且试图用char数组制作的数据库查找到多少东西。

我知道atoi可以处理字符串,但是我无法理解字符串和char数组声明之间的区别(我知道字符串也具有带'/ 0'的char)。

当编译[Warning] initialization makes integer from pointer without a cast int w = LoggersID[j];时,它会产生警告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!

而不是匹配!

有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 ,因此您需要使用atoi函数将字符串转换为int

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


您当然在这里有错别字:

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


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

您的代码有一些问题:

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

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

  • 您可以对数组使用初始化程序,而不必用strcpy()繁琐地初始化元素。

  • 通过调用atoi()strtol()来转换编码为数字的字符串,或者通过读取int w = LoggersId[i][0];的第一个字符的值来完成将数组元素从字符串转换为数值的操作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来配置编译器,以帮助避免此类错误。

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

#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;
}

atoi()仅适用于像这样的字符串"123" 它将返回此字符串的整数值。 一旦检测到0-9以外的任何其他字符,它将终止该过程。 因此,在循环中,您无需检查值1到10。

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

因此,它不打印任何内容。 希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM