Не может изменить струну до

Можно использовать Кнопку с шаблоном пользовательского элемента управления, код ниже является ограниченной кнопкой стиля гиперссылки (например, это только поддерживает текстовые гиперссылки), но возможно это укажет на Вас в правильном направлении.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style x:Key="Link" TargetType="Button">
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
    <Setter Property="Cursor" Value="Hand"/>
    <Setter Property="Foreground" Value="Blue"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <TextBlock TextDecorations="Underline" 
                    Text="{TemplateBinding Content}"
                    Background="{TemplateBinding Background}"/>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Foreground" Value="Red"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
</Page.Resources>
<Button Content="Click Me!" Style="{StaticResource Link}"/>
</Page>
8
задан Peter Mortensen 20 July 2010 в 10:27
поделиться

4 ответа

Указатели символов, определенные с помощью значения инициализации, переходят в сегмент только для чтения. Чтобы сделать их модифицируемыми, вам нужно либо создать их в куче (например, с помощью new / malloc), либо определить их как массив.

Невозможно изменить:

char * foo = "abc";

Изменяемый:

char foo[] = "abc";
28
ответ дан 5 December 2019 в 04:41
поделиться

Строковые литералы не могут быть изменены; лучше предположить, что это не так. См. здесь для получения дополнительной информации.

4
ответ дан 5 December 2019 в 04:41
поделиться

Вы должны выработать привычку сопоставлять тип переменная с типом инициализатора. В этом случае:

const char* test = "abcdefghijklmnopqrstuvwxyz";

Таким образом вы получите ошибку компилятора, а не ошибку времени выполнения. Повышение уровня предупреждений компилятора до максимального также может помочь избежать таких ошибок. Почему это не ошибка C, вероятно, исторически; ранние компиляторы допускали это, а запрет на это могло привести к нарушению слишком большого количества существующего кода, когда язык был стандартизирован. Однако сейчас операционные системы не позволяют этого, так что это академично.

4
ответ дан 5 December 2019 в 04:41
поделиться

Do:

 char * bar = strdup(foo);
 bar[5] = 'x';

strdup создает модифицируемую копию.

И да, вам действительно стоит проверить, что strdup не возвращает NULL.

0
ответ дан 5 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: