这可能是一个非常简单的解决方案,但对于我的生活,我无法弄明白。我正在尝试创建一个char
数组(所以char*
),其中包含从0到numPlayers - 1
的数字,我将遍历这些数字以便访问它。因此,如果numPlayers = 10
,我希望gameState.players
为[0,1,2,3,4,5,6,7,8,9]
。我做错了什么?
printf("How many players will be playing: ");
scanf(" %d", &numPlayers);
gameState.players = (char*) malloc(numPlayers * sizeof(char));
for (int i = 0; i < numPlayers; ++i) {
strcpy(gameState.players[i],(char) i);
}
答案 0 :(得分:1)
首先关闭:
gameState.players = (char*) malloc(numPlayers * sizeof(char));
C中的显式强制转换是不明智的(它可以隐藏某些微妙的错误),而sizeof(char)
的乘法是从不需要 - 它总是< / em> one。
但真正的问题在于:
strcpy(gameState.players[i],(char) i);
str*
函数用于处理C 字符串(空终止字符数组)。你没有拥有一个字符串,而是你有一个字符值,所以它应该更符合以下几行:
gameState.players[i] = i;
您还需要牢记:
char
变量,但输入的值不是数字的文字表示。为此,您需要使用i + '0'
(a)。字符通常用于(大多数)可打印的东西,你最好使用更具体的数据类型,如int
或unsigned short`来表示非字符数据。 (a)&#34;字符&#34;之间存在很大差异。 7
和'7'
。前者实际上具有值7
(ASCII BEL,如果您使用ASCII),后者具有值0x37
(再次,假设ASCII / Unicode)。
数字字符是唯一保证连续的字符,因此您只需添加0..9
即可将数值'0'
转换为可打印字符值。
答案 1 :(得分:0)
调用功能时请小心,你必须确保自己 使用正确的类型。如果使用不正确的编译器,编译器将发出警告 或者打印错误,您应该阅读编译器的警告和错误。他们 告诉你什么是错的。
strcpy
用于复制字符串。功能的签名是
char *strcpy(char *dest, const char *src);
它期望指向char
的指针作为目标,指向char
的指针作为目标
资源。另外strcpy
期望有效的C-String。 C-Strings是一个序列
以char
结尾的'\0'
个字节。如果你没有效果
C-String,您不能使用strcpy
。
strcpy(gameState.players[i],(char) i)
在许多层面都是错的:
char
'1'
不同。角色'1'
实际上是vakue 49
(ASCII码)。如果你想得到一个数字的ASCII表示,你有
要做的事:'0' + digit
。你应该这样做:
for (int i = 0; i < numPlayers; ++i) {
gameState.players[i] = '0' + i;
}
请注意,这只适用于最大值。 9名球员。如果你需要更多,那么你 必须使用字符串数组。
另请注意,gameState.players
未指向C-String,因为它是
不 '\0'
- 已终止。你不能在它上面调用字符串函数。如果你想
为此,你必须改变你的代码:
printf("How many players will be playing: ");
fflush(stdout);
scanf(" %d", &numPlayers);
if(numPlayers > 9)
{
// error, do not continue
}
gameState.players = calloc(numPlayers + 1, sizeof *gameState.players);
for (int i = 0; i < numPlayers; ++i) {
gameState.players[i] = '0' + i;
}