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

Я создал код ниже, используя c ++, но не могу изменить его на c. Я пытаюсь использовать c, чтобы список вывода отображался в конце, но не смог получить список. Мне нужен код языка c для кодирования ниже, который находится в C ++. Пожалуйста, помогите мне.

#include<iostream>
#include<string.h>
using namespace std;

int main(){
    int num;
    int state;
    int a,b,data[num];
    string element[2];

    cout<<"Enter amount data: ";
    cin>>num;
    for(a=0;a<num;a++){
        cout<<"Enter state: ";
        cin>>state;

        if(state==3){
            element[0]="A";
        } else if(state==10){
            element[1]="B";
        }   
    }
    cout<<"Elements are: ";
    for(b=0;b<num;b++){
        cout<<" "<<element[b];
    }
}

Я пытался использовать массив, но не смог получить вывод списка

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

 int main(){
     int num;
     int state;
     int a,b,data[num];
     char str[];

     printf("Enter amount data: ");
     //cin>>num;
     scanf("%d",num);
     for(a=0;a<num;a++){
         printf("Enter state: ");
         //cin>>state;
         printf("%d",state);

         if(state==3){
             *str[0]="A";
         } else if(state==10){
             *str[1]="B";
         } 
     }
     printf("Elemets are: ");
     for(b=0;b<num;b++){
         puts(*str[b])
     }
}

Ответы [ 2 ]

2 голосов
/ 26 октября 2019

Давайте начнем с кода C ++, потому что он содержит ошибку.

    string element[2];            // Array with 2 string

    cout<<"Enter amount data: ";
    cin>>num;                     // Read a number

    ...

    cout<<"Elements are: ";
    for(b=0;b<num;b++){           // Use the number as limit
        cout<<" "<<element[b];    // Print all string from 0 to number-1
    }

Так что, если я дам программе ввод 42, программа получит доступ к element[0], element[1], element[2],element[3], ...., element[41] но массив имеет только 2 элементов, поэтому программа обращается за пределы массива, т. Е. Программа имеет неопределенное поведение.

Преобразование плохогосозданная на C ++ программа на C кажется довольно бессмысленной, но, разумеется, ее можно преобразовать в точно так же плохо сформированную C-программу.

Итак, для C-программы:

Rule #1

Установите ваш компилятор на самый высокий уровень предупреждения и исправьте все предупреждения

При программировании на С предупреждения, которые вы получаете от компилятора, следующие:очень часто указание на ошибку. Поэтому вы должны серьезно относиться к предупреждениям и исправлять их. Даже не запускайте вашу программу, если компилятор выдает только одно предупреждение. Сначала убедитесь, что у вас есть чистая компиляция (т.е. безкомпилирование без предупреждения).

Теперь компиляция вашей программы с помощью "gcc -Wall" дает мне:

main.cpp: In function 'main':
main.cpp:8:11: error: array size missing in 'str'
    8 |      char str[];
      |           ^~~
main.cpp:12:14: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=]
   12 |      scanf("%d",num);
      |             ~^  ~~~
      |              |  |
      |              |  int
      |              int *
main.cpp:19:14: error: invalid type argument of unary '*' (have 'int')
   19 |              *str[0]="A";
      |              ^~~~~~~
main.cpp:21:14: error: invalid type argument of unary '*' (have 'int')
   21 |              *str[1]="B";
      |              ^~~~~~~
main.cpp:26:15: error: invalid type argument of unary '*' (have 'int')
   26 |          puts(*str[b])
      |               ^~~~~~~
main.cpp:26:23: error: expected ';' before '}' token
   26 |          puts(*str[b])
      |                       ^
      |                       ;
   27 |      }
      |      ~                 
main.cpp:7:14: warning: unused variable 'data' [-Wunused-variable]
    7 |      int a,b,data[num];
      |              ^~~~

Итак, у вас есть 2 предупреждения (одноиз них фактическая ошибка) но еще хуже, у вас также есть 5 ошибок. Все это говорит вам, что нужно исправить.

Ваша главная проблема - строки! То, как вы пытаетесь преобразовать тип C ++ string в строку типа C, неверно. Итак, вот небольшое объяснение строк в C.

В C нет типа строки!

Итак

char str[];   // is NOT in any way compatible with C++ string element[2];

(Это на самом делеошибка в C.)

Строки C - это специальное использование массива char. Специальное использование состоит в том, что один элемент в массиве char должен иметь значение '\0' (иначе NUL). Затем этот элемент сигнализирует END-OF-STRING.

Итак, учтите следующее:

char strA[2] = "A"; // strA[0] is 'A' and strA[1] is '\0'

Таким образом, вы создали строку C, равную «A». Примечание: длина строки равна 1, но массиву все еще нужны два символа. Это потому, что для того, чтобы '\0' сигнализировал END-OF-STRING, требуется дополнительный символ.

Поэтому, если вы хотите, чтобы массив с двумя строками содержал «A» или «B», вам нужно сделать:

 char str[2][2];  // instead of just char str[];

Кроме того, вы не можете использовать = для присвоения значений строкам в C. Вам необходимо strcpy («копирование строки»). Например:

strcpy(str[0], "A");  // instead of str[0] = "A"

Наконец, чтобы напечатать строку с новой строкой после нее, просто используйте:

puts(str[0]);  // or puts(str[1]);
0 голосов
/ 26 октября 2019

, поскольку длина строки будет определена после компиляции, она будет установлена ​​во время выполнения ОС

 /* ...   */


    char str[]; 
    str = (char *) malloc(num+1);

  if(state==3){
    str[0]="A";
  } else if(state==10){
    str[1]="B";
  } 

/* ...    */

find your

if (state == 3) {

и попробуйте поставить выше в такой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...