如果我正确解释,我有一个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']
可能是错的,这是我正在做的测试。)
答案 0 :(得分:0)
您的代码存在问题归结为n
和'n'
之间的差异。
n
lvalue
例如int n
,n = 20
等。'n'
rvalue
例如printf("%d", 'n')
将打印110
,字符的ASCII值 n
现在总结一下我们的理解,请看这个例子char n = 'n'
首先n
是一个文字,一个存储字符的变量。这恰好是字符 'n'
char si['n'][30];
应更改为char si[n][30];
scanf("%d", &n)
之前使用si
答案 1 :(得分:0)
您的代码中存在多个问题:
您必须在之后定义si
数组,并且已从用户读取n
的值。 'n'
是字符文字,与n
变量的名称无关。
您必须检查scanf()
的返回值,以确保转换成功。
索引值从C中排除的0
到n
不等。枚举数组成员的经典习惯是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;
}