C строк, дающих странные результаты - PullRequest
0 голосов
/ 07 мая 2020

(1)

#include<stdio.h>
int main()
{
    char str[5]="hello";
    str[5] = "g";
    printf("%s",str);
    return 0;
}

ВЫХОД : hello0
Разве это не должно вызывать ошибку?

(2)

#include<stdio.h>
int main()
{
    char str[5]="hello";
    str[3] = "g";
    printf("%s",str);
    return 0;
}

OUPUT : hel0o
Откуда здесь 0?

Компилятор: TDM -G CC -64
Windows 10
Редактор: Sublime Text

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Я вижу несколько ошибок в данном Коде.

1- В синтаксисе C попытка присвоить значение в двойных кавычках возвращает значение указателя, значение которого является адресом первого индекс этой строки.

Выполняя

    str[3] = "g";

, вы просто просите компилятор ввести «g» где-нибудь в ОЗУ, вернуть адрес этого «g» и присвоить это значение на стр [3]. Поскольку C не является типобезопасным, компилятор автоматически приводит этот указатель к char, и это обычно не заканчивается хорошо.

Я думаю, что вы действительно хотите сделать, это str[3] = 'g'. Таким образом, ваш результат будет helgo.

2- Вы не должны пытаться достичь и определенно не изменять за пределами строки. В конечном итоге вы получите ошибку сегментации или что-то подобное, основанное на вашем компиляторе / ОС. str[5]=x - это не то, что вы хотите, если размер вашей str не меньше 6.

3- В C, когда вы используете% s для printf или аналогичных функций, он начинает показывать значения на экране, начиная с указанного вами указателя (имена массивов на самом деле являются постоянными указателями), пока он не увидит 0. Я не имею в виду символ 0 ('0'), фактическое значение которого равно 48. Литерал 0. Например, попробуйте str[1]=0, и в вашем printf он просто покажет h.

1 голос
/ 07 мая 2020
  1. Разве это не должно выдавать ошибку?

Компилятор не обнаруживает, когда вы пытаетесь писать за пределами массив.

Но помимо этого str[5] = "g"; выдает предупреждение:

предупреждение: присвоение 'char' из 'char *' делает целое число из указателя без приведения [- Wint-преобразование]

Поскольку вы присваиваете строку элементу char, поведение и вывод не определены.

Откуда сюда идет 0?

Пример:

char str[5]="hello";
str[3] = "g";

Обратите внимание, что "g" - это строка, а не символьная константа, например 'g'. Строка всегда имеет завершающий нулевой символ. Этот нулевой символ записан в 5-й элемент str.

Кроме того, поскольку вы используете тот же неправильный оператор str[3] = "g";, поведение здесь также не определено.


Что вы нужно:

#include <stdio.h>

int main(void)
{
    char str[6] = "hello";
    str[3] = 'g';
    printf("%s", str);
    return 0;
}

Вывод:

helgo
1 голос
/ 07 мая 2020

Вы должны были заметить, что значение, которое вы присваиваете str[3], является типом строки, а не символом. Если вы используете str[3] = 'g', вы больше не должны получать ошибку.

Рассмотрим следующий код:

#include <stdio.h>

int main(void) {
    char str[5] = "hello";
    str[3] = 'g'; // "g" != 'g'

    printf("%s\n", str);

    return 0;
}
...