[英]Can I define and assign an integer array at the same time like we do with the string array?
这是我同时定义和分配字符串数组的方式
#include <stdio.h>
#include <cs50.h>
#include <string.h>
int main()
{
string word = get_string("Enter a Word;");
for(int i = 0; i<strlen(word); i++)
{
printf("%c\n",word[i]);
}
}
现在我想应用相同的技术从用户那里获取 integer 值
#include <stdio.h>
#include <cs50.h>
int main()
{
int scores[] = get_int("Enter score:");
int len = sizeof(scores)/sizeof(int);
for(int i = 0; i<len; i++)
{
printf("%i\n", scores[i]);
}
}
但是代码没有被编译,编译器是这样说的:
IntArray.c:5:9: error: array initializer must be an initializer list or wide string literal
int scores[] = get_int("Enter integer:");
^
1 error generated.
make: *** [<builtin>: IntArray] Error 1
我知道我们有一个用于该解决方案的 for 循环,它是这样的: 这就是为什么我必须继续使用 for 循环,它看起来像这样:
#include <stdio.h>
#include <cs50.h>
int main()
{
int scores[3];
for(int I = 0; I<3; I++)
{
score[I] = get_int("Enter score: ");
}
for(int j =0; j<3; j++)
{
printf("%I\n", scores[j]);
}
}
我的问题是我可以同时定义和分配 integer 数组吗?
我试图在处理单个字符串的同时定义和分配一个 integer 数组,但我做不到。
我可以像处理字符串数组那样同时定义和分配一个 integer 数组吗?
string word
不是数组。 object 是一个 CS50 类型的string
,它是一个指针,指向一个char
数组。
Arrays 不是指针。
指针不是 arrays。
代码可以创建类似的代码来定义一个int
指针......
// string word = get_string("Enter a Word;");
int *ints = get_ints("Enter ints;");
...并使用特殊值(如INT_MIN
)来表示int
数组的末尾。 当然, INT_MIN
不可用作读取的值。 这类似于 C strings ,它使用特殊值null 字符来表示数组的结尾。
我的问题是我可以同时定义和分配 integer 数组吗?
是的。
请参阅@MM评论。
int scores[] = { get_int("Enter score:"), get_int("Enter score:"), get_int("Enter score:") };
这要求在获取数据之前确定数组大小。
代码可以将int
读入一些数据集合,然后使用int
计数来定义可变长度数组(VLA)。 但是 VLA 可能没有被初始化。 他们可以稍后分配。
some_tbd_data_collection_type data = 0;
unsigned n = get_ints(&data);
int a[n];
for (unsigned i = 0; i < n; i++) {
a[i] = get_int(&data, i);
}
data_free(&data);
建立在这个早期的答案之上。 function read_ints读取整数直到读取end_of_list ,然后返回。
void read_ints(Array *a, int end_of_list)
{
int current;
while(1){
scanf("%d",¤t);
if(current == end_of_list) return;
insertArray(a,current);
}
}
int main()
{
Array a;
initArray(&a, 5);
printf("Enter numbers:");
read_ints(&a,-1);
for(int i=0; i<a.used; i++) printf("%d ", a.array[i]);
return 0;
}
这是我同时定义和分配字符串数组的方式
这种说法是不正确的。 在行
string word = get_string("Enter a Word;");
变量word
不是数组。 特别是,数据类型string
不是数组,而是对数组的引用(“指针”)。 您将在CS50 的第 4 周了解到这一点。
真正发生的是 function get_string
根据用户输入创建一个数组并返回对这个新创建的数组的引用。 然后将此引用存储在变量word
中。 因此,您正在创建引用的副本,而不是数组本身的副本。
这是一个用于演示目的的示例程序:
#include <cs50.h>
#include <stdio.h>
int main( void )
{
string word1 = get_string( "Enter a word: " );
string word2 = word1;
word2[0] = 'J';
printf( "\nContent of strings:\n" );
printf( "word1: %s\n", word1 );
printf( "word2: %s\n", word2 );
}
在上面的程序中,如果用户输入Test
,那么该行
string word2 = word1;
不会复制包含字符Test
的数组,而只会复制对数组的引用。 之后,您将有两个变量引用同一个数组。
如果您随后使用修改数组的第一个字符
word2[0] = 'J';
您将修改word1
和word2
引用的数组。 因此,线
printf( "word1: %s\n", word1 );
printf( "word2: %s\n", word2 );
不会 output 原来的输入Test
,但都会 output Jest
。
出于这个原因,你的问题有一半没有意义,因为初始化数组不能与初始化数组的引用(“指针”)进行比较。
我的问题是我可以同时定义和分配 integer 数组吗?
线路
int scores[] = get_int("Enter score:");
不管用。
另一方面,
int scores[] = { get_int("Enter score:") };
会工作,但这可能不是你想要的,因为它只会创建一个大小为1
的数组并且调用 function get_int
只会要求用户提供一个int
。
如果你想向用户询问多个int
值,那么你将不得不多次调用 function get_int
,例如:
int scores[] = {
get_int( "Enter first score: "),
get_int( "Enter second score: "),
get_int( "Enter third score: ")
};
但是,此解决方案并不理想,尤其是当您稍后想要将程序更改为具有 3 个以上的输入时。 因此,不在声明中初始化数组而是使用循环(就像您在上一个代码片段中所做的那样)可能是更好的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.