整数数组空 - C
Int array empty - C
我正在尝试编写一个程序,它将采用两组字符串 N 和 Q。该程序的目标是打印出 Q 中每个字符串在 N 中出现的次数。但是,我正在努力在 C 中管理字符串和指针,特别是我相信我的问题源于试图拥有一个字符串数组。执行以下代码时出现分段错误。我已经注释掉了我使用 printf() 进行调试的尝试。我相信当我尝试将 S 分配给 N_array.
时会出现问题
int main() {
int N, Q;
char *N_array[1000], *Q_array[1000];
scanf("%d", &N);
for (int N_i = 0; N_i < N; N_i++) {
//printf("made it through A for loop %d times\n", N_i+1);
scanf("%s", N_array[N_i]);
}
scanf("%d", &Q);
//Does the array contain any information?
//for (int N_i = 0; N_i < N; N_i++) { printf("N_array[%d] == %d\n", N_i, N_array[N_i]);}
for (int Q_i = 0; Q_i < Q; Q_i++) {
//printf("Made it to B for loop\n");
int occurs = 0, result;
char s[21];
scanf("%s", &s[21]);
strcpy(Q_array[Q_i], s);
for (int N_i2 = 0; N_i2 < N; N_i2++) {
//printf("Made it to C for loop\n");
result = strcmp(Q_array[Q_i], N_array[N_i2]);
if (result == 0) occurs++;
}
printf("%d", occurs);
}
return 0;
}
scanf("%s", N_array[N_i]);
这应该会导致 SegFault
正如预期的那样,因为 N_array[N_i]
不包含有效的内存地址。
您需要的是使用 malloc
、calloc
分配内存以将 N_array[N_i]
指向有效的内存位置。
正确的代码是:
for (int N_i = 0; N_i < N; N_i++)
{
if(!(N_array[N_i] = malloc((MAX_STRING_LENGTH + 1) * sizeof(char))))
{
printf("malloc failed!\n);
exit(1);
}
scanf("%s", N_array[N_i]);
}
scanf("%s", &s[21]);
这是不正确的,因为 %s
期望 char *
但 &s[21]
的类型是 char **
。
您需要改用 scanf("%20s", s);
。
这样 scanf
最多只读取 20
个字符(因为我们有 char s[21]
个字符。所以将最后一个字节留给 [=27=]
个字符),这样可以避免意外缓冲区溢出(用户输入的字符串长度大于20)。
strcpy(Q_array[Q_i], s);
此处再次 Q_array[Q_i]
指向无效的内存地址,因为它包含垃圾值。使用malloc
、calloc
等先分配内存。
正确的代码可能是:
if(!(Q_array[Q_i] = malloc((MAX_STRING_LENGTH + 1) * sizeof(char))))
{
printf("malloc failed!\n);
exit(1);
}
strcpy(Q_array[Q_i], s);
这里有一个问题
for (int N_i = 0; N_i < N; N_i++) {
//printf("made it through A for loop %d times\n", N_i+1);
scanf("%s", N_array[N_i]);
}
N_Array 包含 1000 个指向 char 的指针,但这些指针中的每一个都指向,好吧……无处可去。它是一个未初始化的指针,指向您不拥有的随机内存位置。这是未定义的行为。你必须在 scanf
.
之前分配内存
N_Array[N_i] = malloc(max_length_of_string + 1);
另一个问题是这一行
char s[21];
scanf("%s", &s[21]);
scanf 的第二个参数应该只是 s
,而不是 &s[21]
,它就在您的数组之外。
下面的一行与我第一点中描述的问题相同
strcpy(Q_array[Q_i], s);
Q_array[Q_i]
尚未指向任何允许写入的内存。你也应该在这里分配内存。
我正在尝试编写一个程序,它将采用两组字符串 N 和 Q。该程序的目标是打印出 Q 中每个字符串在 N 中出现的次数。但是,我正在努力在 C 中管理字符串和指针,特别是我相信我的问题源于试图拥有一个字符串数组。执行以下代码时出现分段错误。我已经注释掉了我使用 printf() 进行调试的尝试。我相信当我尝试将 S 分配给 N_array.
时会出现问题int main() {
int N, Q;
char *N_array[1000], *Q_array[1000];
scanf("%d", &N);
for (int N_i = 0; N_i < N; N_i++) {
//printf("made it through A for loop %d times\n", N_i+1);
scanf("%s", N_array[N_i]);
}
scanf("%d", &Q);
//Does the array contain any information?
//for (int N_i = 0; N_i < N; N_i++) { printf("N_array[%d] == %d\n", N_i, N_array[N_i]);}
for (int Q_i = 0; Q_i < Q; Q_i++) {
//printf("Made it to B for loop\n");
int occurs = 0, result;
char s[21];
scanf("%s", &s[21]);
strcpy(Q_array[Q_i], s);
for (int N_i2 = 0; N_i2 < N; N_i2++) {
//printf("Made it to C for loop\n");
result = strcmp(Q_array[Q_i], N_array[N_i2]);
if (result == 0) occurs++;
}
printf("%d", occurs);
}
return 0;
}
scanf("%s", N_array[N_i]);
这应该会导致
SegFault
正如预期的那样,因为N_array[N_i]
不包含有效的内存地址。您需要的是使用
malloc
、calloc
分配内存以将N_array[N_i]
指向有效的内存位置。
正确的代码是:
for (int N_i = 0; N_i < N; N_i++)
{
if(!(N_array[N_i] = malloc((MAX_STRING_LENGTH + 1) * sizeof(char))))
{
printf("malloc failed!\n);
exit(1);
}
scanf("%s", N_array[N_i]);
}
scanf("%s", &s[21]);
这是不正确的,因为
%s
期望char *
但&s[21]
的类型是char **
。您需要改用
scanf("%20s", s);
。这样
scanf
最多只读取20
个字符(因为我们有char s[21]
个字符。所以将最后一个字节留给[=27=]
个字符),这样可以避免意外缓冲区溢出(用户输入的字符串长度大于20)。
strcpy(Q_array[Q_i], s);
此处再次
Q_array[Q_i]
指向无效的内存地址,因为它包含垃圾值。使用malloc
、calloc
等先分配内存。
正确的代码可能是:
if(!(Q_array[Q_i] = malloc((MAX_STRING_LENGTH + 1) * sizeof(char))))
{
printf("malloc failed!\n);
exit(1);
}
strcpy(Q_array[Q_i], s);
这里有一个问题
for (int N_i = 0; N_i < N; N_i++) {
//printf("made it through A for loop %d times\n", N_i+1);
scanf("%s", N_array[N_i]);
}
N_Array 包含 1000 个指向 char 的指针,但这些指针中的每一个都指向,好吧……无处可去。它是一个未初始化的指针,指向您不拥有的随机内存位置。这是未定义的行为。你必须在 scanf
.
N_Array[N_i] = malloc(max_length_of_string + 1);
另一个问题是这一行
char s[21];
scanf("%s", &s[21]);
scanf 的第二个参数应该只是 s
,而不是 &s[21]
,它就在您的数组之外。
下面的一行与我第一点中描述的问题相同
strcpy(Q_array[Q_i], s);
Q_array[Q_i]
尚未指向任何允许写入的内存。你也应该在这里分配内存。