C语言 我可以像定义字符串数组那样同时定义和赋值整型数组吗?

nwsw7zdq  于 2023-01-16  发布在  其他
关注(0)|答案(3)|浏览(124)

下面是我如何同时定义和赋值字符串数组

#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]);
    }
}

现在,我想应用相同的技术从user中获取整数值

#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]);
    }
}

我的问题是我可以同时定义和赋值整型数组吗?
我试图像处理单个字符串一样,同时定义和赋值整型数组,但我做不到。

pengsaosao

pengsaosao1#

我可以像定义字符串数组那样同时定义和赋值整型数组吗?
string word不是数组。该对象是CS50类型string,它是一个指针,指向char数组。
数组不是指针。
指针不是数组。
代码可以创建类似的代码来定义int指针...

// string word = get_string("Enter a Word;");
int *ints = get_ints("Enter ints;");

...并使用一个特殊的值,如INT_MIN,来表示int s数组的结尾。当然,INT_MIN不能作为一个可读取的值。这类似于C * strings *,它使用一个特殊的值,即 * null字符 * 来表示数组的结尾。
我的问题是我可以同时定义和赋值整型数组吗?
是的。
见@M. M评论。

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);
wyyhbhjk

wyyhbhjk2#

earlier answer的基础上,函数 *read_int * 读取整数,直到读取到 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;
}
5vf7fwbs

5vf7fwbs3#

下面是我如何同时定义和赋值字符串数组
此语句不正确。在行中

string word = get_string("Enter a Word;");

变量word不是数组。特别是,数据类型string不是数组,而是数组的引用("指针")。你将在week 4 of CS50中学习这一点。
实际上,函数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 );

将不输出原始输入Test,但两者都将输出Jest
由于这个原因,你的问题有一半是没有意义的,因为初始化数组不能与初始化数组的引用("指针")相比。
我的问题是我可以同时定义和赋值整型数组吗?
这条线

int scores[] = get_int("Enter score:");

不会起作用。
另一方面,

int scores[] = { get_int("Enter score:") };

将工作,但这可能不是您想要的,因为它将只创建一个大小为1的数组,并且调用函数get_int将只要求用户提供一个int
如果你想让用户输入几个int值,那么你必须多次调用函数get_int,例如:

int scores[] = {
    get_int( "Enter first score: "),
    get_int( "Enter second score: "),
    get_int( "Enter third score: ")
};

然而,这种解决方案并不理想,特别是如果您以后想要将程序更改为具有3个以上的输入。因此,在声明中不初始化数组,而是使用循环(就像您在上一个代码片段中所做的那样)可能是更好的解决方案。

相关问题