在C中填充char *

时间:2018-01-29 01:13:03

标签: c arrays

这可能是一个非常简单的解决方案,但对于我的生活,我无法弄明白。我正在尝试创建一个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);
  }

2 个答案:

答案 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)

在许多层面都是错的:

  1. 参数是 指针char
  2. 您没有处理有效的C字符串
  3. 铸造在这里没有帮助你,你甚至做错了。
  4. 1与'1'不同。角色'1'实际上是vakue 49 (ASCII码)。如果你想得到一个数字的ASCII表示,你有 要做的事:'0' + digit
  5. 你应该这样做:

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