Пока цикл застрял после обработки последней строки массива в C - PullRequest
0 голосов
/ 21 февраля 2019

Ниже приведен мой код, который застревает на if((p_note_for_sm[msg_line_no]) != NULL) в функции int Ms_SEnd(char **p_note_for_sm).После отладки условия if я обнаружил, что значение p_note_for_sm[msg_line_no] не печатается после обработки до последнего символа массива, и программа не может выйти из цикла, а программа застревает.Я ожидаю, что значение NULL в p_note_for_sm[msg_line_no] прервет этот цикл.

Пожалуйста, помогите мне найти решение.

#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <math.h>
#define SMAXLINE              200

int Ms_SEnd(char **p_note_for_sm)
{
    int msg_line_no = 0;

    while (msg_line_no <= 200)
    {
        if ((p_note_for_sm[msg_line_no]) != NULL)
        {
            if (strcmp(p_note_for_sm[msg_line_no], "\0") != 0)
            {
                printf("\nMsg In SM loop inside [%s]", p_note_for_sm[msg_line_no]);
            }
            else
            {
                break;
            }
            msg_line_no++;
        }
        else
        {
            break;
        }
    }
}

int main()
{
    char *chr_h_note_for_sm[SMAXLINE];
    char chr_h_note_1_new[8000] = "\0";
    char chr_h_note_new[8000] = "1 RECITE PREVIOUS MINUTES OF LAST AGM  2 DISCUSS THE BOD REPORT  3 DISCUSS THE AUDITORS REPORT  4 DISCUSS THE GENERAL BUDGET WITH THE PROFIT AND LOSS AND DISCUSS THE PERCENTAGE OF  CASH DIVIDENDS THAT WILL BE DISTRIBUTED  5 INDEMNIFY THE BOD  6 ELECT THE AUDITORS FOR THE YEAR 2019  7 DISCUSS OTHER ISSUES";
    int l_tail_pos = 0;
    int l_counter = 0;
    int msg_line_no = 0;
    int rownum = 1;
    int l_temp = 0;
    int l_length = 305;
    while (l_tail_pos < l_length)
    {
        chr_h_note_for_sm[l_counter] = (char *)calloc(36, sizeof(char));

        if ((l_length - l_tail_pos) < 35)
        {
            for (l_temp = 0; l_length > l_tail_pos; l_temp++)
            {
                chr_h_note_for_sm[l_counter][l_temp] = chr_h_note_new[l_tail_pos++];
            }
            chr_h_note_for_sm[l_counter][l_temp] = '\0';
        }
        else
        {
            strncpy(chr_h_note_for_sm[l_counter], chr_h_note_new + l_tail_pos, 35);
            chr_h_note_for_sm[l_counter][36] = '\0';
        }
        l_counter++;
        l_tail_pos = l_tail_pos + 35;
    }

    Ms_SEnd(&chr_h_note_for_sm);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Вы никогда не устанавливаете последний указатель в chr_h_note_for_sm (и, следовательно, p_note_for_sm) в NULL.Значения NULL в строках не будут видны этим оператором if, поскольку это потребует от вас разыменования p_note_for_sm [msg_line_no].Решение состоит в том, чтобы добавить NULL-указатель в конец chr_h_note_for_sm перед вызовом Ms_SEnd, например так:

chr_h_note_for_sm[l_counter] = NULL;
/* l_counter is already at the correct index 
   due to the l_counter++ at the end of the while loop.*/
Ms_SEnd(&chr_h_note_for_sm);

Теперь цикл while прервется, поскольку в p_note_for_sm есть указатель NULL.

0 голосов
/ 21 февраля 2019

Фактически, что касается использования функции Ms_SEnd, она принимает в качестве параметра char**, и вы передали ему адрес chr_h_note_for_sm, который объявлен как char *chr_h_note_for_sm[SMAXLINE].
Вы должны перейти к немупросто chr_h_note_for_sm, его тип уже совместим с char**.

Я рекомендую также использовать strlen(chr_h_note_new) для инициализации l_length.

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#define SMAXLINE 200

int Ms_SEnd(char **p_note_for_sm) {
  int msg_line_no = 0;

  while (msg_line_no <= 200) {
    if ((p_note_for_sm[msg_line_no]) != NULL) {
      printf("Msg In SM loop inside [%s]\n", p_note_for_sm[msg_line_no]);
      msg_line_no++;
    } else {
      break;
    }
  }
}
int main() {
  char *chr_h_note_for_sm[SMAXLINE];
  char chr_h_note_1_new[8000] = "\0";
  char chr_h_note_new[8000] =
      "1 RECITE PREVIOUS MINUTES OF LAST AGM  2 DISCUSS THE BOD REPORT  3 "
      "DISCUSS THE AUDITORS REPORT  4 DISCUSS THE GENERAL BUDGET WITH THE "
      "PROFIT AND LOSS AND DISCUSS THE PERCENTAGE OF  CASH DIVIDENDS THAT WILL "
      "BE DISTRIBUTED  5 INDEMNIFY THE BOD  6 ELECT THE AUDITORS FOR THE YEAR "
      "2019  7 DISCUSS OTHER ISSUES";

  int l_tail_pos = 0;
  int l_counter = 0;
  int msg_line_no = 0;
  int rownum = 1;
  int l_temp = 0;
  int l_length = strlen(chr_h_note_new);

  while (l_tail_pos < l_length) {
    chr_h_note_for_sm[l_counter] = (char *)calloc(36, sizeof(char));

    if ((l_length - l_tail_pos) < 35) {
      for (l_temp = 0; l_length > l_tail_pos; l_temp++) {
        chr_h_note_for_sm[l_counter][l_temp] = chr_h_note_new[l_tail_pos++];
      }
      chr_h_note_for_sm[l_counter][l_temp] = '\0';
    } else {
      strncpy(chr_h_note_for_sm[l_counter], chr_h_note_new + l_tail_pos, 35);
      chr_h_note_for_sm[l_counter][36] = '\0';
    }
    l_counter++;
    l_tail_pos = l_tail_pos + 35;
  }

  Ms_SEnd(chr_h_note_for_sm);
  return 0;
}
...