2017-06-29 75 views
0

我正在学习C,我试图找出如何用char数组创建数据库。我知道atoi使用字符串,但我不明白字符串和字符数组声明之间的区别(我明白字符串也有'/ 0'字符)。atoi()不能与char数组一起工作

它在该行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; 
} 

编译 [Warning] initialization makes integer from pointer without a cast时产生的警告当我运行它,我得到

Lets start! 

Program finished! 

,而不是匹配!

+4

'的strcpy(LoggersID [30], “10”);'可能不是空终止 – byxor

+1

'int w = LoggersID [j];' - >'int w = atoi(LoggersID [j]);'? – BLUEPIXY

+0

'int w = atoi(LoggersID [j])'试图将字符串转换为数字,你似乎想要的是'int w = LoggersID [j] [0]'来比较ascii码 – Ctx

回答

2

您的代码有一些问题:

  • 阵列设在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; 
} 
0

atoi()只适用于像这样的字符串中的数字"123"。它将为此字符串返回整数值。只要检测到0-9以外的任何字符,就会终止该过程。因此,在循环中,您不检查值1到10.

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

因此它不打印任何东西。希望这可以帮助。

+0

有什么方法可以打印字符或字符串的ASCII? – CameFromSpace

+0

是的,执行你自己的atoi()来满足特定的需求。 'int atoii(con​​st char * arr) { \t return arr [0]; }' 根据您的示例和需要,这是一个参考,仅针对数组中的1个字符编写。 – anil

2

有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]。这个警告实际上大部分时间都是一个错误。


你当然这里有一个错字:

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


更换strcpy(LoggersID[10], "T");到了30条的strcpy线可以通过约6的代码行要替换的路径。