将 get_string 分配给二维数组的循环函数有什么问题? (在三)
What is wrong with my looped function to assign a get_string to a 2-d array? (in c)
我一直在研究的 cs50 问题集让我陷入困境。
我是编程新手,我一直在用 c 编写一个程序,将 get_string 结果放入一个二维数组中,每个单词在数组中分开(这实际上不适用于cs50问题集,所以不用担心)。
毫无疑问,有更简单更好的方法来实现我想要做的事情,但对于这个实验,我只想知道我错过了什么。
据我所知(通过我的大量调试 printf),函数的第一部分是正确的,创建了一个具有足够内存的数组来 a) 单独存储所有单词,以及 b) 存储最大的单词在 get_string。
第二部分是沿着get_string长度计数,将每个字符分配到新创建的数组中的适当索引中。
这是我遇到问题的地方。根据 get_string 中的内容,我每次都会在不同的位置遇到分段错误。
我在函数中输入了一些随机字符串来测试它。
"One by one they counted alphabetical letters"。这在 "they" 之后的 space 处停止。
"I like icecream" 在 "like"、
之后停止
"Flavor" 在 "r".
之前停止
当我使用 debug50(在 cs50 IDE 中)时,我可以通过在运行 "isspace" 检查之前暂停它来让程序再循环几次。
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void readLevel();
int main(void)
{
// string text = get_string("Text:\n");
readLevel();
}
void readLevel()
{
/* you can ignore all this
int l = 0; //letters per 100 words
int s = 0; //number of sentences per 100 words
int indx = 0.0588 * l - 0.296 * s - 15.8;
*/
string text = get_string("Text:\n");
string sizeTextCopy = text;
string sortTextCopy = text;
//debug prints
printf("size copy is: %s\n", sizeTextCopy);
printf("sort copy is: %s\n", sortTextCopy);
//
int a = 0;
int b = 0;
int bsz = 0;
for (int c = 0; strlen(sizeTextCopy) > c; c++)
{
char sTCChar = sizeTextCopy[c];
if (isspace(sTCChar))
{
//debug prints
printf("b is : %i\n", b);
printf("a is : %i\n", a);
//
b++;
a++;
while (b > bsz)
{
bsz = b;
//debug prints
printf("bsz is : %i\n", bsz);
//
}
b = 0;
}
else
{
//debug prints
printf("b is : %i\n", b);
//
b++;
}
}
string firstArr [a][bsz];
int i = 0;
int t = 0;
//debug prints
int sTCL = strlen(sizeTextCopy);
printf("strlen is: %i\n", sTCL);
for (int w = 0; strlen(sizeTextCopy) > w; w++)
{
char textsortchar = text[w];
//debug prints
printf("tsc is %c\n", textsortchar);
printf("%i\n", w);
if (isspace(textsortchar))
{
firstArr [i][t] = &textsortchar;
i++;
//debug prints
printf("letter %i of word %i is : %s\n", t, i, firstArr[i][t]);
//
t = 0;
}
else
{
firstArr [i][t] = &textsortchar;
//debug prints
printf("letter %i of word %i is : %s\n", t, i, firstArr[i][t]);
//
t++;
}
}
// this was to print out the array, but ^that^ doesn't work yet.
for (int s111 = 0; a > s111; s111++)
for (int s112 = 0; s112 < sizeof(firstArr[s111]); s112++)
printf("%s", firstArr[s111][s112]);
}
请不要为了我的代码而谋杀我。我上周真的开始了 CS50。我并不是真的要求更好的代码,或者写得不好的东西,我只是想知道它为什么会出错。
感谢您的观看。
我认为您的问题是您已将 firstArr
声明为 string
的二维数组。
查看您的代码,string
似乎是 char *
(当您将其传递给 strlen 时)。
这意味着您得到了一个指向 char 的二维指针数组。您后面的代码将所有这些指针设置为指向局部 char
变量 (textsortchar
) 的地址。当您尝试使用 printf 打印此内容时,您正在访问本地 char 变量的地址,就好像它是一个 char *,因此打印开始读取堆栈 space 它不应该,寻找终止 '\ 0'.
firstArr
应该是 char
的二维数组,因为您要在每个位置存储单个字符。这将消除 textsortchar
赋值中对 &
的需要(这是获取其地址,而不是其值),随后的 printf
可以在格式中使用“%c”,因此您不会尝试使用单个 char
的地址打印字符串
我一直在研究的 cs50 问题集让我陷入困境。 我是编程新手,我一直在用 c 编写一个程序,将 get_string 结果放入一个二维数组中,每个单词在数组中分开(这实际上不适用于cs50问题集,所以不用担心)。 毫无疑问,有更简单更好的方法来实现我想要做的事情,但对于这个实验,我只想知道我错过了什么。
据我所知(通过我的大量调试 printf),函数的第一部分是正确的,创建了一个具有足够内存的数组来 a) 单独存储所有单词,以及 b) 存储最大的单词在 get_string。
第二部分是沿着get_string长度计数,将每个字符分配到新创建的数组中的适当索引中。 这是我遇到问题的地方。根据 get_string 中的内容,我每次都会在不同的位置遇到分段错误。
我在函数中输入了一些随机字符串来测试它。
"One by one they counted alphabetical letters"。这在 "they" 之后的 space 处停止。
"I like icecream" 在 "like"、
之后停止"Flavor" 在 "r".
之前停止当我使用 debug50(在 cs50 IDE 中)时,我可以通过在运行 "isspace" 检查之前暂停它来让程序再循环几次。
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void readLevel();
int main(void)
{
// string text = get_string("Text:\n");
readLevel();
}
void readLevel()
{
/* you can ignore all this
int l = 0; //letters per 100 words
int s = 0; //number of sentences per 100 words
int indx = 0.0588 * l - 0.296 * s - 15.8;
*/
string text = get_string("Text:\n");
string sizeTextCopy = text;
string sortTextCopy = text;
//debug prints
printf("size copy is: %s\n", sizeTextCopy);
printf("sort copy is: %s\n", sortTextCopy);
//
int a = 0;
int b = 0;
int bsz = 0;
for (int c = 0; strlen(sizeTextCopy) > c; c++)
{
char sTCChar = sizeTextCopy[c];
if (isspace(sTCChar))
{
//debug prints
printf("b is : %i\n", b);
printf("a is : %i\n", a);
//
b++;
a++;
while (b > bsz)
{
bsz = b;
//debug prints
printf("bsz is : %i\n", bsz);
//
}
b = 0;
}
else
{
//debug prints
printf("b is : %i\n", b);
//
b++;
}
}
string firstArr [a][bsz];
int i = 0;
int t = 0;
//debug prints
int sTCL = strlen(sizeTextCopy);
printf("strlen is: %i\n", sTCL);
for (int w = 0; strlen(sizeTextCopy) > w; w++)
{
char textsortchar = text[w];
//debug prints
printf("tsc is %c\n", textsortchar);
printf("%i\n", w);
if (isspace(textsortchar))
{
firstArr [i][t] = &textsortchar;
i++;
//debug prints
printf("letter %i of word %i is : %s\n", t, i, firstArr[i][t]);
//
t = 0;
}
else
{
firstArr [i][t] = &textsortchar;
//debug prints
printf("letter %i of word %i is : %s\n", t, i, firstArr[i][t]);
//
t++;
}
}
// this was to print out the array, but ^that^ doesn't work yet.
for (int s111 = 0; a > s111; s111++)
for (int s112 = 0; s112 < sizeof(firstArr[s111]); s112++)
printf("%s", firstArr[s111][s112]);
}
请不要为了我的代码而谋杀我。我上周真的开始了 CS50。我并不是真的要求更好的代码,或者写得不好的东西,我只是想知道它为什么会出错。 感谢您的观看。
我认为您的问题是您已将 firstArr
声明为 string
的二维数组。
查看您的代码,string
似乎是 char *
(当您将其传递给 strlen 时)。
这意味着您得到了一个指向 char 的二维指针数组。您后面的代码将所有这些指针设置为指向局部 char
变量 (textsortchar
) 的地址。当您尝试使用 printf 打印此内容时,您正在访问本地 char 变量的地址,就好像它是一个 char *,因此打印开始读取堆栈 space 它不应该,寻找终止 '\ 0'.
firstArr
应该是 char
的二维数组,因为您要在每个位置存储单个字符。这将消除 textsortchar
赋值中对 &
的需要(这是获取其地址,而不是其值),随后的 printf
可以在格式中使用“%c”,因此您不会尝试使用单个 char