我试图运行代码,但它无法构建。我想读取3个不同的名称,每个名称最多40个字符,保存在一个向量中并打印出来。我需要使用函数来完成它。我得到"可变大小的对象可能无法初始化"对于第15行。我相信如果未定义向量的大小,我可能会收到此错误。我已经尝试使用常量(NOMESQUAN和NOMESTAM)和声明(nomes [3] [41])来定义它,但每次都会得到相同的错误。
#include <stdio.h>
#include <stdlib.h>
#define NOMESQUAN 3
#define NOMESTAM 41
int lenomes(int i);
int main()
{
int i;
char nomes[NOMESQUAN][NOMESTAM];
for(i=0; i<3; i++){
char nomes[i][NOMESTAM] = lenomes(i); /*LINE 15*/
}
}
int lenomes(int i){
char nome[NOMESTAM];
printf("Digite o nome %d", i);
gets(nome);
return nome;
}
答案 0 :(得分:0)
首先,函数lenomes
包含无意义的代码,不会编译。您无法从函数返回数组。并且您还没有声明函数返回数组,您已声明它返回int
。你告诉我,这有多大意义。
char nomes [NOMESQUAN] [NOMESTAM];
这里你声明一个数组,但是然后在循环内再次声明另一个数组char nomes[i][NOMESTAM]
,但这次是一个可变长度数组(因为i
是一个运行时变量)。这样的数组无法初始化,因为它们只有在运行时获取值才有意义。
总而言之,在编程时,你不仅要抓住语言语法的机会,你实际上必须知道你写的每一行都是什么。
你可能想要做这样的事情:
#include <stdio.h>
#include <stdlib.h>
#define NOMESQUAN 3
#define NOMESTAM 41
void lenomes (int i, char nomes[i][NOMESTAM]);
int main()
{
int i;
char nomes[NOMESQUAN][NOMESTAM];
for(i=0; i<NOMESQUAN; i++){
lenomes(i, nomes);
}
}
void lenomes (int i, char nomes[i][NOMESTAM]) {
printf("Digite o nome %d", i);
gets(nome[i]);
}
答案 1 :(得分:0)
在本声明中
char nomes[i][NOMESTAM] = lenomes(i); /*LINE 15*/
定义了一个尝试初始化的可变长度数组。首先,VLA可能无法初始化,并且在任何情况下初始化都不正确。
功能lenomes
也无效。
int lenomes(int i){ char nome [NOMESTAM];
printf("Digite o nome %d", i);
gets(nome);
return nome;
}
它尝试返回一个转换为int类型的指针,该指针具有退出函数后将被销毁的本地数组的第一个元素的地址。
考虑到C标准不再支持函数gets
,因为它不安全。
您需要以下内容
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NOMESQUAN 3
#define NOMESTAM 41
char * lenomes( char *nome, size_t n );
int main( void )
{
size_t i;
char nomes[NOMESQUAN][NOMESTAM];
for ( i = 0; i < sizeof( nomes ) / sizeof( *nomes ); i++ )
{
lenomes( nomes[i], sizeof( nomes[i] ) );
}
}
char * lenomes( char *nome, size_t n )
{
char *p;
printf( "Digite o nome " );
p = fgets( nome, n, stdin );
if ( p ) p[strcspn( p, "\n" )] = '\0';
return p;
}
答案 2 :(得分:0)
在显示代码中存在问题的注释的帮助下,这是一个可能的实现。
#include <stdio.h> /* io functions MUST be declared */
#define NOMESQUAN 3
#define NOMESTAM 41
/* pass a buffer and a length to io routine */
char *lenomes(int i, char *buf, int sz);
int main()
{
int i;
char nomes[NOMESQUAN][NOMESTAM];
for(i=0; i<3; i++){
lenomes(i, nomes[i], NOMESTAM); /*LINE 15*/
}
}
char* lenomes(int i, char *nome, int sz){
printf("Digite o nome %d", i);
return fgets(nome, sz, stdin); /* NEVER use gets */
}