Проблема с двумерными массивами символов, программа не печатает - PullRequest
0 голосов
/ 10 февраля 2019

Я борюсь с двумерными массивами символов, Я хочу создать список поездов, но, похоже, что-то здесь не так, так как после того, как я зарегистрировал 7 имен, программа автоматически закроется ..Может ли кто-нибудь помочь мне и объяснить, как правильно писать программу каждый раз?Благодарю.** ПРИМЕЧАНИЕ: *** код еще не закончен *

#include <stdio.h>
#include <stdlib.h>

#include <string.h>
#define N 7
#define M 20
int main()
{  FILE *fp;
   fp=fopen("Lines.txt","w");
    int i,n;
   char trains[N][M];
   char train[M];
  for(n=0;n<N;n++)
 {
     scanf("%s", train);
     strncpy(trains[n],train,M-1);

  }
  for(n=0;n<N;n++)
 {
     for(i=0;i<M;i++)
     {
         printf("%s\n", trains[n][i]);
     }

  }


  return 0;
}

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019
  for(n=0;n<N;n++)
 {
     for(i=0;i<M;i++)
     {
         printf("%s\n", trains[n][i]);
     }

  }

должно быть

  for(n=0;n<N;n++)
  {
         printf("%s\n", trains[n]);

  }

Это потому, что в вашем массиве символов trains каждая строка содержит введенную вами строку.Когда вы делаете trains[n][i], он пытается получить доступ к определенному символу внутри строки.

Если вы хотите напечатать каждый символ, попробуйте, как показано ниже:

 for(n=0;n<N;n++)
 {
     for(i=0;i<M && trains[n][i]!='\0';i++)
     {
         printf("%c", trains[n][i]);
     }
     printf("\n");
  }
0 голосов
/ 10 февраля 2019

с

 char trains[N][M];

значение printf в

 for(i=0;i<M;i++)
 {
     printf("%s\n", trains[n][i]);
 }

недопустимо, поскольку trains[n][i] является символом, и вы печатаете его в виде строки (% s)

Вся форма, включая для , может быть заменена на

 printf("%s\n", trains[n]);

В противном случае вы можете писать char символом char, но вам нужно остановиться, когда вы достигнете null char:

 for(i=0; trains[n][i] != 0 ; i++)
 {
     printf("%c", trains[n][i]);
 }
 putchar('\n');

Вы открываете файл, но не пишете в


Вам необходимо проверить результат fopen , чтобы убедиться, что файл был открыт


Другая проблема в

 scanf("%s", train);
 strncpy(trains[n],train,M-1);

strncpy не копирует окончательный нулевой символ

Поскольку у вас есть

чередующихся символов [N] [M];char train [M];

Для использования промежуточного поезд бесполезен и не предлагает защищенного (его размер, если не длиннее trains[x])

Вам нужночтобы проверить возвращаемое значение scanf и прочитать до 19 символов (M - 1), вы можете сделать это:

if (scanf("%19s", trains[n]) != 1)
  break;

У вас нет гарантии, что вы прочитали 7 поездовпоэтому вы должны изменить цикл после:

for (i = 0; i != n; ++i)
  printf("%s\n", trains[n]);

Вы также можете использовать ставит в этом случае

И если вы хотите также писать в открытом файле

for (i = 0; i != n; ++i) {
  fprintf(sp, "%s\n", trains[n]);
  puts(trains[n]);
}

Наконец, ваша программа может быть

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 7
#define M 20

int main()
{ 
  FILE * fp=fopen("Lines.txt","w");

  if (fp == 0) {
    puts("cannot open Lines.txt");
    return -1;
  }

  int i,n;
  char trains[N][M];

  for(n = 0; n<N; n++)
  {
    if (scanf("%19s", trains[n]) != 1)
      break;
  }

  for(i = 0; i != n; ++i)
  {
      fprintf(fp, "%s\n", trains[i]);
      /*puts(trains[i]);*/
  }

  fclose(fp);
  return 0;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
train1
train2
train3
train4
train5
train6
train7
pi@raspberrypi:/tmp $ cat Lines.txt 
train1
train2
train3
train4
train5
train6
train7
pi@raspberrypi:/tmp $ 

Обратите внимание, если название поезда содержит более 19 символовбудет вырезано, пример:

pi@raspberrypi:/tmp $ ./a.out
train1
verylongnameofatrain
train3
train4
train5
train6
pi@raspberrypi:/tmp $ cat Lines.txt 
train1
verylongnameofatrai
n
train3
train4
train5
train6
pi@raspberrypi:/tmp $ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...