I';我只是想把字符串扫描到数组中。我做错了什么? #包括 #包括 内部主(空){ const int NUM_VALS=20; int i; 输入端; char userString[actualInput][NUM_VALS]; int matchCount=0; scanf(“%d”和“输入”); 对于(i=0;i
输出: 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.soutI';我只是想把字符串扫描到数组中。我做错了什么? #包括 #包括 内部主(空){ 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
我尝试了一些变体,在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];
}