使一个字符串的行数等于变量的值

时间:2017-02-16 19:25:28

标签: c arrays string

如果我正确解释,我有一个char变量(si)作为字符串。 因为它基本上是一个数组,我想让它与变量(n)的行具有相同的行。

以下是代码:

int n, i, j;
char si['n'][30];

printf("Introduce the number of teams in the championship\n");
scanf("%d", &n);

for (j = 1; j <=n; j++) {
    printf("Introduce the number of the team and the name separated by a space\n");
    scanf("%d %s", &i, &si[n]);
}

for (j = 1; j <= n; j++) {
    printf("%s\n", si[n]);
}

si['n']可能是错的,这是我正在做的测试。)

2 个答案:

答案 0 :(得分:0)

您的代码存在问题归结为n'n'之间的差异。

  1. n
    这是文字。通常,当单独使用时,可以将其解释为变量名称。这可以用作lvalue 例如int nn = 20等。
  2. 'n'
    这是来自ASCII集的字符,它经常衰减为ASCII值。这用作rvalue 例如printf("%d", 'n')将打印110字符的ASCII值 n
  3. 现在总结一下我们的理解,请看这个例子char n = 'n'
    首先n是一个文字,一个存储字符的变量。这恰好是字符 'n'

    1. 因此,您的代码char si['n'][30];应更改为char si[n][30];
    2. 要使用C变长数组,您应该在声明数组scanf("%d", &n)之前使用si

答案 1 :(得分:0)

您的代码中存在多个问题:

  • 您必须在之后定义si数组,并且已从用户读取n的值。 'n'是字符文字,与n变量的名称无关。

  • 您必须检查scanf()的返回值,以确保转换成功。

  • 索引值从C中排除的0n不等。枚举数组成员的经典习惯是for (i = 0; i < n; i++) { ... }

  • 您无法使用一个scanf()团队编号及其名称阅读。

以下是您的代码的修改版本:

#include <stdio.h>

#define MAX_TEAMS  128  /* reasonable maximum number of teams */

int main(void) {
    int n, i, j;

    printf("Introduce the number of teams in the championship\n");
    if (scanf("%d", &n) != 1 || n <= 0 || n > MAX_TEAMS) {
        fprintf(stderr, "invalid number of teams\n");
        return 1;
    }

    char si[n][30];

    for (j = 0; j < n; j++) {
        printf("Introduce the number of the team and the name separated by a space\n");
        if (scanf("%d", &i) != 1 || i < 1 || i > n) {
            fprintf(stderr, "invalid team number\n");
            return 1;
        }
        if (scanf(" %29[^\n]", si[i - 1]) != 1) {
            fprintf(stderr, "missing team name\n");
            return 1;
        }
    }

    for (j = 0; j < n; j++) {
        printf("%d %s\n", j + 1, si[j]);
    }
    return 0;
}