在C语言中读取字符串数组
我需要从每个字符串中的2个字母中读取n个字符串的数组(例如,n=3,需要读取“ab-bf-cs”附近的内容)。我使用此代码并得到分段错误:在C语言中读取字符串数组,c,input,segmentation-fault,scanf,stdin,C,Input,Segmentation Fault,Scanf,Stdin,我需要从每个字符串中的2个字母中读取n个字符串的数组(例如,n=3,需要读取“ab-bf-cs”附近的内容)。我使用此代码并得到分段错误: int n; scanf("%d", &n); char array[n][2]; char *tmp; for (int i = 0; i < n; i++) { scanf("%s", &tmp); strcpy(array[i], tmp); } intn; scanf(“%d”和“&n”); 字符数组[n][2
int n;
scanf("%d", &n);
char array[n][2];
char *tmp;
for (int i = 0; i < n; i++)
{
scanf("%s", &tmp);
strcpy(array[i], tmp);
}
intn;
scanf(“%d”和“&n”);
字符数组[n][2];
char*tmp;
对于(int i=0;i
请帮我修一下 问题1 要存储长度为2的字符串,需要大小为3的
char
数组。使用:
char array[n][3];
问题2
您正在调用scanf
时使用&tmp
。这在两个方面是错误的
&tmp
的类型是char**
scanf
需要一个带有%s
格式说明符的char*
&tmp
无法保存字符串scanf("%s", tmp);
从类型的角度来看,这是可以的,但从运行时的角度来看,这是不可以的,因为tmp
没有指向任何有效的内容
您可以完全取消tmp
,并使用:
scanf("%s", array[i]);
整个代码块可以是:
int n;
scanf("%d", &n);
char array[n][3];
for (int i = 0; i < n; i++)
{
// Make sure you don't read more than 2 chars.
scanf("%2s", array[i]);
}
intn;
scanf(“%d”和“&n”);
字符数组[n][3];
对于(int i=0;i
这里有几件事需要解决
char[]
)总是以空终止字符结尾\0
。因此,无论何时创建char[]
,都必须为其留出足够的空间。例如:
scanf("%s", array[n]);
charstr[3]=“foo”
看起来像['f','o','o']
,但是
charstr[4]=“foo”代码>看起来像['f','o','o','\0']
使用前者时可能会出现意外后果
这意味着您应该将字符数组[n][2]
更改为字符数组[n][3]
char*tmp
更改为char tmp[3]
tmp
变量。如果需要,可以直接将读取的单词存储到数组中。例如:
scanf("%s", array[n]);
tmp
变量作为char*
,请为其分配内存,如下所示:
char *tmp = (char*)malloc(3 * sizeof(char));
for(int i=0…
)的循环中,您应该声明int i代码>位于文件顶部,然后在循环中为(i=0…)分配它
首先,正如user3121023在评论中指出的,
char*tmp代码>创建没有分配内存的指针。scanf()需要一个数组,您需要为终止的'\0'
留出空间(这可能是分段错误的根源)。所以您可以尝试scanf(“%s”,array[i])代码>
其次,最好使用“%2s”
而不是“%s”
,这样用户就不会输入3位数字并使缓冲区溢出
这里有一个解决方案
int n;
scanf("%d", &n);
char array[n][3];
for (int i = 0; i < n; i++)
{
scanf("%2s", array[i]);
}
intn;
scanf(“%d”和“&n”);
字符数组[n][3];
对于(int i=0;i
不同意“除了常量或整数文字外,不能声明任何大小的数组。”C99和可选的C11允许可变长度数组。谢谢。我不知道。我已经更新了我的答案。char*tmp=(char*)malloc(3*sizeof(char))
可以简化为char*tmp=malloc(3)代码>或char*tmp=malloc(sizeof*tmp*3)代码>