Давайте начнем с кода 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]);