I';我只是想把字符串扫描到数组中。我做错了什么? #包括 #包括 内部主(空){ const int NUM_VALS=20; int i; 输入端; char userString[actualInput][NUM_VALS]; int matchCount=0; scanf(“%d”和“输入”); 对于(i=0;i

I';我只是想把字符串扫描到数组中。我做错了什么? #包括 #包括 内部主(空){ const int NUM_VALS=20; int i; 输入端; char userString[actualInput][NUM_VALS]; int matchCount=0; scanf(“%d”和“输入”); 对于(i=0;i,c,arrays,string,C,Arrays,String,输出: b'hellohi\x80\x07@\xd2\x05@\x9a\x16[\xea\xccp\xa6\x15\xf6\x18+\xbf\x87\x8a\x84)\x05@\xfe\x7f'b'\x92\x1fk\xb3\xfe\xAE\xfe\xAE\xAE\x118\x08\xe8\x03\x0eY\x03k\xb3\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE{\x8cx86_64'F-8sbin

输出:

b'hellohi\x80\x07@\xd2\x05@\x9a\x16[\xea\xccp\xa6\x15\xf6\x18+\xbf\x87\x8a\x84)\x05@\xfe\x7f'b'\x92\x1fk\xb3\xfe\xAE\xfe\xAE\xAE\x118\x08\xe8\x03\x0eY\x03k\xb3\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE{\x8cx86_64'F-8sbin:/usr/local/bin:/usr/bin:/sbin:/bin/usr/sbin:/usr/bin:/sbin:/binTF-88tf8RELOAD=/usr/lib/x86_64-linux-gnu/coreutils/libstdbuf.so64-linux-gnu/coreutils/libstdbuf.sols/libstdbuf.sout


我尝试了一些变体,在scanf函数中将userString[I]替换为userString。结果是输出了我最后一个字符串的50000个输入。我不明白发生了什么。

问题在于这一系列代码:

#include <stdio.h>
#include <string.h>

int main(void) {

   const int NUM_VALS = 20;
   int i;
   int actualInput;
   char userString[actualInput][NUM_VALS];
   int matchCount = 0;

   scanf("%d", &actualInput);

   for (i = 0; i < actualInput; ++i) {
      scanf("%s", userString[i]);
      printf("%s", userString[i]);
   }



   return 0;
}
第一行声明了一个名为
actualInput
的变量,但没有为该变量赋值

第二行使用
actualInput
中的值声明a。使用未初始化变量的值会导致,这基本上意味着在代码中的该点之后,任何事情都可能发生。可能发生的情况(根据您对问题的描述)就是说,
actualInput
要么是零,要么是一个小数字,所以你得到的数组太小,无法容纳你的输入

最后一行(带有
scanf
)最后为
actualInput
指定了一个值。您可能认为当
actualInput
发生更改时,数组将自行调整大小。这绝对不会发生。在C中,创建VLA后,其大小无法更改

解决方案很简单,重新排列代码,使事情按正确的顺序进行:

int actualInput;
char userString[actualInput][NUM_VALS];
int matchCount = 0; 

scanf("%d", &actualInput);
作为补充说明,在使用该数字创建数组之前,您确实应该进行一些错误检查,以确保用户输入了一个合理的数字

int actualInput;
scanf("%d", &actualInput);
char userString[actualInput][NUM_VALS];

int matchCount = 0;
int-nput;
如果(scanf(“%d”,&actualInput)!=1 | | actualInput<1 | | actualInput>1000)
{
printf(“这不是有效的数组大小\n”);
返回1;
}
char userString[actualInput][NUM_VALS];

您不能将其声明为2D数组,然后将其视为普通数组。 每个案例应仅包含一封信,但不能自动完成,我建议您添加以下内容:

int actualInput;
if (scanf("%d", &actualInput) != 1 || actualInput < 1 || actualInput > 1000)
{
    printf("That is not a valid array size\n");
    return 1;
}
char userString[actualInput][NUM_VALS];
for(i=0;i对于(k=0;k当前,您的程序显示未定义的行为,因为您在初始化之前读取了
actualInput
。此外,您是否打算使用可变长度数组?您希望
char userString[actualInput][NUM\VALS]中的
actualInput
值是什么
to be?主要问题就在这里。我建议您阅读一些关于C语言内存管理的介绍。当时
char userString[actualInput][NUM\u VALS]
声明,
actualInput
是单元化垃圾,因此无法知道您分配了多少内存。此外,NUM\u VALS是每个字符串的最大长度,因此它应该是max\u length或更具意义的内容。
gets(stri);
从C11开始就没有使用过C。它完成了任务,至少他们在UNI说了什么“它完成了任务”,这意味着他们是按照旧的C语言标准来教你的——而不是专业的语言方法。大学很可能在C语言方面落后于时代。请看和。
for (i = 0; i < actualInput; ++i) 
{
    gets(stri);
    for (k=0;k<strlen(stri);k++)
    userString[i][j]=stri[j];
}