繁体   English   中英

我可以像处理字符串数组那样同时定义和分配一个 integer 数组吗?

[英]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",&current);
        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';

您将修改word1word2引用的数组。 因此,线

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM