Почему мой массив печатается неправильно?

#c #arrays #c-strings

#c #массивы #c-строки

Вопрос:

Я написал простую программу, которая переворачивает массив. Например, строка ‘hello’ будет напечатана как ‘olleh’. Однако, когда я ввожу что-то вроде «привет», он выводит половину строки в обратном порядке, за которой следуют некоторые загадочные символы и другая ерунда, которой там быть не должно.

Мой исходный код выглядит следующим образом:

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

int main()
{
    char str[100], temp;
    int i = 0, j = 0;

    printf("Enter a string:n");
    fgets(str, 100, stdin);
//  scanf("%s", amp;str);

    j = strlen(str) - 1;
    while (i < j) {
        temp = str[i];
        str[i] = str[j];
        str[j] = str[temp];
        i  ;
        j--;
    }

    printf("The reversed string is: %s", str);

    return (0);
}
  

Часть выходных данных, которые я получаю, — это «oll», а затем маленький квадрат с четырьмя числами внутри. Это может варьироваться, иногда печатается ‘olx’ или ‘olH’ или даже ‘ol’ с вопросительным знаком в форме ромба. Почему моя программа не работает должным образом? Содержит ли массив уже какую-либо другую закодированную информацию?

Комментарии:

1. Разве это не должно быть str[j] = temp; вместо str[j] = str[temp]; ?

Ответ №1:

Давайте подробнее рассмотрим эти две строки:

 temp = str[i];
...
str[j] = str[temp];
  

В первом вы устанавливаете temp символ в str[i] . Другой, который вы используете temp в качестве индекса str . Но temp это не индекс, это символ. Итак, последняя строка должна быть

 str[j] = temp;
  

Комментарии:

1. Спасибо, что прояснили мое замешательство. Мое письмо просто становится неуклюжим, когда я устаю 😉

Ответ №2:

Ваш алгоритм в порядке. Вам просто нужно заменить

 str[j] = str[temp];
  

Автор:

 str[j] = temp;
  

Комментарии:

1. О, теперь я вижу, это была просто глупая ошибка, которую я допустил при написании. Но я не понимаю, чем отличаются две строки. Разве они оба просто str[j] не равны str[i] ?

2. О, подождите, теперь я понял. Это потому str[i] , что на самом деле представляет символ, поэтому str[temp] в основном говорит str[str[i]] , что у вас не может быть, потому что вы не можете ссылаться на элемент с символом.