У меня есть упражнение для использования цикла for для инициализации 1 массива строк от A до Z, а затем от Z до A.
Мне удалось распечатать от А до Я, но печать от Я до А не работает. Поэтому мне нужно помочь в этом коде.
char *problem58()
{
char temp, *result = (char *)malloc(52 * sizeof(char));
int left = 0, right = 52 - 1;
for (char i = 'A'; i <= 'Z'; i++)
{
result[left] = i;
printf("%c", i);
left++;
}
// this is my idea to reverse this string
for (int i = left; i < right; i++)
{
temp = result[left];
result[left] = result[right];
result[right] = temp;
printf("%c", result[right]);
right--;
}
return result;
}
код строки запускается в терминале: ABCDEFGHIJKLMNOPQRSTUVWXYZSW\:C=cepSmoC
result[left] = result[right]; - что вы присвоили result[right] на тот момент? Он выглядит неинициализированным для меня.
Кроме того, избегайте магических чисел, таких как 52. Сделайте это size_t len = ('Z'-'A' + 1) * 2; и используйте len вместо этого. Еще одна деталь: поскольку вы возвращаете указатель на этот массив, возможно, вам следует завершить массив нулем на тот случай, если он предназначен для печати?
Сколько раз вы пишете в каждое место в результате?





Это для цикла
for (int i = left; i < right; i++)
{
temp = result[left];
result[left] = result[right];
//..
вызывает неопределенное поведение, поскольку динамически выделяемый массив не был инициализирован, и в результате выражения result[left] и result[right] имеют неопределенные значения. В массиве нечего менять местами. Массив должен быть заполнен символами.
Также массив ни в коем случае не содержит строку, потому что он не дополняется завершающим нулевым символом '\0';.
Если я правильно понял задание, вам нужно что-то вроде следующего. Обратите внимание, что функция может быть реализована по-разному.
Например
char * problem58( void )
{
char *s = malloc( 2 * ( 'Z' - 'A' + 1 ) + 1 );
if ( s != NULL )
{
char *p = s;
char c = 'A';
do
{
*p++ = c;
} while ( c++ != 'Z' );
while ( c != 'A' )
{
*p++ = --c;
}
*p = '\0';
}
return s;
}
или
char * problem58( void )
{
size_t n = 2 * ( 'Z' - 'A' + 1 );
char *s = malloc( n + 1 );
if (s != NULL)
{
char *first = s, *last = s + n;
*last = '\0';
char c = 'A';
do
{
*first++ = *--last = c;
} while (c++ != 'Z');
}
return s;
}
И функция вызывается в основном как
char *s = problem58();
if ( s != NULL ) puts( s );
free( s );
Ожидаемый результат вызова функции
ABCDEFGHIJKLMNOPQRSTUVWXYZZYXWVUTSRQPONMLKJIHGFEDCBA
Re «вызывает неопределенное поведение, потому что… неопределенные значения»: использование неопределенных значений само по себе не вызывает неопределенного поведения. Это разные вещи с разными последствиями.
@EricPostpischil Из стандарта C «1 неопределенное поведение при использовании непереносимой или ошибочной программной конструкции или ошибочных данных, для которых этот международный стандарт не предъявляет требований»
Это из Приложения J.2, которое не является нормативным резюме (оно не является частью официального стандарта). Это неверно в этом отношении; нормативный текст (который является официальным стандартом) не использует неопределенные значения неопределенного поведения.
@EricPostpischil По сравнению с построением строки его функция имеет неопределенное поведение, поскольку использует ошибочные данные. Например, функция может построить ожидаемую строку, если память, используемая выделенным массивом, уже содержит требуемые данные.
@EricPostpischil И приведенная мной цитата определяет общее понятие неопределенного поведения.
Вот мой ответ
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* problem58()
{
int n = 0;
int left = 0, right = 52 - 1;
// A--->Z and Z--->A total number is 52, because string end with '\0'(0), so add 1 is 53.
char* result = (char*)malloc(53 * sizeof(char));
// Check if it is possible to dynamically allocate memory for 53 variables of type "char"
// You can also write like this: if (result == NULL)
if (NULL == result){
printf("No space\n");
exit(1);
}
// Initial result with 0,because string end with ('\0')0.
// So result[0] will be 0, result[1] will be 0 ...... result[52] will be 0
for(int m = 0; m < 53;m++){
result[m] = 0;
}
for (char i = 'A'; i <= 'Z'; i++)
{
result[left] = i;
//printf("%c", i);
left++;
}
// Now left is 26, reset it to 0, because result[0] is 'A'
left = 0;
// n is execute times, need to let result[51] = result[0] = 'A', and result[50] = result[1] = 'B' ......
//so right-- and left++
for (n = 0; n < 26; n++)
{
result[right] = result[left];
right--;
left++;
}
return result;
}
int main()
{
char* str = problem58();
printf("str's length is %ld\n",strlen(str));
printf("%s\n",str);
free(str);
return 0;
}
Запустите, он выведет
str's length is 52
ABCDEFGHIJKLMNOPQRSTUVWXYZZYXWVUTSRQPONMLKJIHGFEDCBA
Код без объяснения не является хорошим ответом.
@EricPostpischil Я изменил свой ответ, добавив комментарий. Спасибо за ваше замечание.
@Whozcry спасибо за ответ. но в кодовом блоке if (NULL == result) я этого не понимаю, и в кодовом блоке for(; m < 53;m++){ я не понимаю. Можете ли вы объяснить это для меня?
@Dinosour Я обновил свой ответ, добавив больше комментариев.
возможно, похоже на stackoverflow.com/questions/784417/reversing-a-string-in-c