Что не так с моей зацикленной функцией для присвоения get_string 2-мерному массиву? (в c) - PullRequest
0 голосов
/ 19 июня 2020

Набор задач cs50, над которым я работал, отправил меня в кроличью нору. Я новичок в программировании, и я работал над программой в c, чтобы поместить результат get_string в двумерный массив, с каждым словом, разделенным в массиве (что действительно не относится к проблеме cs50 set, так что не беспокойтесь об этом). Несомненно, более простые и лучшие способы добиться того, что я пытаюсь сделать, но для этого эксперимента я просто хочу знать, чего мне не хватает.

Насколько я могу судить (с моими многочисленными отладочными printf), первая часть функции верна: создается массив с достаточным объемом памяти для: а) хранения всех слов по отдельности и б) хранения самого большого слова в get_string.

Вторая часть предназначена для подсчета длины get_string, присваивая каждому символу соответствующий индекс во вновь созданном массиве. Вот где у меня проблемы. Я каждый раз сталкиваюсь с ошибкой сегментации в разных местах в зависимости от того, что находится в get_string.

Я ввел в функцию несколько случайных строк, чтобы проверить ее.

«Они посчитали буквы алфавита одну за другой». Это останавливается на пробеле после «они».

«Мне нравится мороженое» останавливается после «нравится»,

«Ароматизатор» останавливается прямо перед «r».

Когда Я использую debug50 (в IDE cs50), я могу еще несколько раз довести программу до l oop, приостановив ее перед запуском проверки "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. На самом деле я не прошу лучшего кода или того, что написано плохо, я просто хотел бы знать, почему это ошибки. Спасибо, что заглянули.

1 Ответ

0 голосов
/ 19 июня 2020

Я считаю, что ваша проблема в том, что вы объявили firstArr как двумерный массив string s.

Глядя на ваш код, кажется, что string это char * (как вы передать его в strlen).

Это означает, что вы получили двумерный массив указателей на char. Ваш более поздний код устанавливает все эти указатели так, чтобы они указывали на адрес локальной char переменной (textsortchar). Когда вы пытаетесь распечатать это с помощью printf, вы получаете доступ к адресу локальной переменной char, как если бы это был char *, поэтому печать начинает читать через пространство стека, которого не должно быть, ища завершающий '\ 0'.

firstArr вместо этого должен быть двухмерным массивом char, поскольку вы сохраняете отдельные символы в каждом месте. Это устранит необходимость в & в назначении из textsortchar (которое получает его адрес, а не его значение), а последующий printf может использовать «% c» в формате, поэтому вы не пытается напечатать строку, используя адрес одного char

...