将 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

的地址打印字符串