Как скопировать символ *ул. для обугливания c [] в C?

Это, кажется, тонкая ошибка в шаблоне управления для GroupBox. Я нашел путем редактирования шаблона по умолчанию для GroupBox, и перемещение Границы под названием 'Заголовок' к последнему объекту в управлении обрабатывает элемент Сетки по шаблону, проблема разрешает себя.

причина состоит в том, что тот из других элементов Границы с TemplateBinding BorderBrush далее снизился в визуальном дереве и получал щелчок мышью, вот почему устанавливание в NULL BorderBrush позволило CheckBox правильно получать щелчок мышью.

Ниже заканчивается стиль для GroupBox. Это почти идентично шаблону по умолчанию для управления, за исключением элемента Границы под названием 'Заголовок', который является теперь последним ребенком Сетки, а не вторым.

<BorderGapMaskConverter x:Key="BorderGapMaskConverter"/>

<Style x:Key="GroupBoxStyle1" TargetType="{x:Type GroupBox}">
    <Setter Property="BorderBrush" Value="#D5DFE5"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupBox}">
                <Grid SnapsToDevicePixels="true">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="6"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="6"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="6"/>
                    </Grid.ColumnDefinitions>
                    <Border Grid.Column="0" Grid.ColumnSpan="4" Grid.Row="1" Grid.RowSpan="3" Background="{TemplateBinding Background}" BorderBrush="Transparent" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4"/>
                    <ContentPresenter Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="2"/>
                    <Border Grid.ColumnSpan="4" Grid.Row="1" Grid.RowSpan="3" BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4">
                        <Border.OpacityMask>
                            <MultiBinding Converter="{StaticResource BorderGapMaskConverter}" ConverterParameter="7">
                                <Binding Path="ActualWidth" ElementName="Header"/>
                                <Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"/>
                                <Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"/>
                            </MultiBinding>
                        </Border.OpacityMask>
                        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3">
                            <Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"/>
                        </Border>
                    </Border>
                    <Border x:Name="Header" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Padding="3,1,3,0">
                        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" ContentSource="Header" RecognizesAccessKey="True"/>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
12
задан thatWiseGuy 8 November 2015 в 21:45
поделиться

6 ответов

use strncpy() rather than strcpy()

/* code not tested */
#include <string.h>

int main(void) {
  char *src = "gkjsdh fkdshfkjsdhfksdjghf ewi7tr weigrfdhf gsdjfsd jfgsdjf gsdjfgwe";
  char dst[10]; /* not enough for all of src */

  strcpy(dst, src); /* BANG!!! */
  strncpy(dst, src, sizeof dst - 1); /* OK ... but `dst` needs to be NUL terminated */
      dst[9] = '\0';
  return 0;
}
20
ответ дан 2 December 2019 в 06:45
поделиться
char *str = "Hello";
char c[6];
strcpy( c, str );
2
ответ дан 2 December 2019 в 06:45
поделиться

use strncpy to be sure to not copy more charachters than the char[] can contains

char *s = "abcdef";
char c[6];

strncpy(c, s, sizeof(c)-1);
// strncpy is not adding a \0 at the end of the string after copying it so you need to add it by yourself
c[sizeof(c)-1] = '\0';

Edit: Code added to question

Viewing your code the segmentation fault could be by the line

strcpy(c, token)

The problem is if token length is bigger than c length then memory is filled out of the c var and that cause troubles.

1
ответ дан 2 December 2019 в 06:45
поделиться

char c[] must have some size;

for example

char c[]= "example init string";

// that set up table c to c[19]; You can allocate it directly at the begginign of Your program;

char c[19] = {0}; // null filled table

char c[i] is the pointer so You don't need to copy anything; char c[19] ; c = "example init string"; // now &c[0] points the same address;

Copy can be done wiht

 strcpy(dst, src);

but MS force You to use secure function:

strcpy_s(dst,buffsize,src);
0
ответ дан 2 December 2019 в 06:45
поделиться

Прошло много времени с тех пор, как я кодировал c / c ++, но c [80], вероятно, размещен в стеке. Если вы используете char * c и strdup или что-то подобное, вы выделяете его в куче, где strtok может получить к нему доступ.

Попробуйте что-нибудь вроде этого.

char *token = "some random string";
char *c;
c = strdup(token);
char *broken = strtok(c, "#");
free(c);
0
ответ дан 2 December 2019 в 06:45
поделиться

Edited: Thanks for adding the code.

Perhaps the segfault occurs here:

strncpy(c, token, sizeof c - 1); 

sizeof has a the same precedence as '-' from right to left, so it is probably processed as :

strncpy(c, token, sizeof( c - 1 ) ); 

instead of

strncpy(c, token, sizeof(c) - 1); 

which is probably what you wanted

(reference: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence)

0
ответ дан 2 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

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