我正在学习C,我正在尝试使用char数组生成的数据库找到更多的东西。
我知道atoi使用字符串,但是我无法理解string和char数组声明之间的区别(我理解字符串也有一个带有'/ 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!
而不是匹配!
答案 0 :(得分:2)
有3个问题:
将char LoggersID[50][2];
替换为char LoggersID[50][3];
以下行将3个字符复制到2个char缓冲区中。由于"10"
终结符,字符串文字NUL
占用了3个字符。
strcpy(LoggersID[30], "10");
将int w = LoggersID[j];
替换为int w = atoi(LoggersID[j]);
。
LoggersID[j]
是char*
(指向char
的指针),而不是int
,因此您需要使用{将字符串转换为int
{3}}功能。
这就是你收到警告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行代码替换。
答案 1 :(得分: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 -Werror
或clang -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;
}
答案 2 :(得分:0)
atoi()
仅适用于此"123"
字符串中的数字。它将返回此字符串的整数值。一旦检测到除0-9之外的任何字符,它就会终止该过程。因此,在循环中,您不会检查值1到10。
int w = atoi(LoggersID[j]);
if (w == i)
所以它不打印任何东西。希望这会有所帮助。