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 -Werror
或 clang -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;
}
我正在学习 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 -Werror
或clang -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;
}