我写了一个程序来完成这些任务:首先从用户那里获取一个字符串,并用sizeof()函数计算它的大小。这是我的代码:
#include <stdio.h>
int main()
{
char U1[];
puts("Enter a string:");
scanf("%s", U1);
printf("The %s has %i bytes.", U1, sizeof(U1));
return 0;
}
编译错误是:error: array size missing in ‘U1’
为什么?请解释这里有什么问题?
答案 0 :(得分:2)
您需要定义数组大小以告诉编译器要分配多少空间:
char U1[256];
如果在编译时不知道数组的大小,可以使用malloc
动态分配内存:
// #include <stdlib.h>
int *arr;
int n, i;
printf("Number of elements: ");
scanf("%d", &n);
// Allocate n ints
arr = malloc(n * sizeof(int));
printf("Enter %d elements: ", n);
for(i = 0; i < n; i++)
scanf("%d", &arr[i]);
printf("Here they are: ");
for(i = 0; i < n; i++)
printf("%d ", arr[i]);
// Free the array on the end!
free(arr);
注意强>
printf("The %s has %i bytes.", U1, sizeof(U1));
将始终打印256,因为sizeof
返回在编译时扣除的数组的大小,而不是刚刚读入数组的字符数。您可以使用sizeof(char) * (strlen(U1) + 1)
来计算字符串所需的字节数(+1来自字符串末尾的NUL-terminator字符)。
答案 1 :(得分:2)
C数组是固定长度的,因此每个数组在声明时都需要完全指定其大小。有效声明如下:
char U1[256];
请注意,如果用户输入的字符数超过该数字(减去终止零的一个字符),则该程序的行为未定义。要避免此问题,请将scanf("%s")
替换为fgets()
并了解dynamic arrays。
答案 2 :(得分:0)
您需要为数组指定大小。 Scanf采用已经分配的数组并且不调整它的大小,只是用输入填充它。
您的代码应如下所示:
#include <stdio.h>
int main()
{
char U1[256];
puts("Enter a string:");
scanf("%s", U1);
printf("The %s has %i bytes.", U1, strlen(U1));
return 0;
}
请注意,我没有使用sizeof
,因为我将拥有数组的整个大小,而不仅仅是字符串。 strlen
将为您提供以C结尾的字符串的大小。
答案 3 :(得分:0)
你应该制作一个特定的数组,正常的C编译不支持动态数组。
答案 4 :(得分:0)
C中的数组需要用大小声明。另一种选择是使用指针
的动态数组