我知道这很简单。我在尝试之前尝试在stackoverflow中寻找答案,但无法找到答案。
protected void RadGrid1_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
dynamic data = new[] {
new { ID = 1, Name ="Name1"},
new { ID = 2, Name ="Name2"} };
RadGrid1.DataSource = data;
}
protected void RadGrid1_DetailTableDataBind(object sender, GridDetailTableDataBindEventArgs e)
{
GridDataItem parentItem = e.DetailTableView.ParentItem as GridDataItem;
if (e.DetailTableView.Name == "Images")
{
dynamic data = new[] {
new { ID = 11, Name ="Name11"},
new { ID = 12, Name ="Name12"} };
e.DetailTableView.DataSource = data;
}
else if (e.DetailTableView.Name == "Something")
{
dynamic data = new[] {
new { ID = 111, Name ="Name111"},
new { ID = 112, Name ="Name112"} };
e.DetailTableView.DataSource = data;
}
}
protected void RadGrid1_ItemCommand(object sender, GridCommandEventArgs e)
{
if (e.CommandName == "ExpandSomething")
{
GridDataItem item = e.Item as GridDataItem;
item.Expanded = true;
if (e.Item.HasChildItems)
{
item.ChildItem.NestedTableViews[0].Visible = false;
item.ChildItem.NestedTableViews[1].Visible = true;
}
foreach (GridDataItem otheritem in RadGrid1.MasterTableView.Items)
{
if (otheritem.Expanded && item.GetDataKeyValue("ID").ToString() != otheritem.GetDataKeyValue("ID").ToString())
{
otheritem.Expanded = false;
}
}
}
else if (e.CommandName == "ExpandSomethingElse")
{
GridDataItem item = e.Item as GridDataItem;
item.Expanded = true;
if (e.Item.HasChildItems)
{
item.ChildItem.NestedTableViews[0].Visible = true;
item.ChildItem.NestedTableViews[1].Visible = false;
}
foreach (GridDataItem otheritem in RadGrid1.MasterTableView.Items)
{
if (otheritem.Expanded && item.GetDataKeyValue("ID").ToString() != otheritem.GetDataKeyValue("ID").ToString())
{
otheritem.Expanded = false;
}
}
}
}
我明白了:
char str[5], new_str[5];
int i, len;
printf("Enter a string: ");
scanf("%s", str);
len = strlen(str);
for (i = 0; i < len; i++){
new_str[i] = str[i];
}
printf("Result: %s", new_str);
我知道如何正确地做到这一点(使用malloc),但我试图理解为什么输出发生了。
答案 0 :(得分:3)
变量new_str
在其末尾没有'\0'
符号,因为它是一个数组但不是“字符串”。
对printf("%s", new_str);
的调用将整个字符串打印到'\0'
符号,该符号以字符串结尾。
显示输入后,str
相当于{"1","2","3","4","5","\0"}
而new_str
相当于{"1","2","3","4","5"}
,因为您只复制了5个符号。因此,printf
会在12345(new_str
)之后打印其他符号,这些符号位于内存的下一个单元格中,直到找到空字节为止。这是未定义的行为。
答案 1 :(得分:0)
您需要将空终止符添加到字符串中。
即。添加
new_str[i] = 0;
之前
printf....
无论如何也许
for (i = 0; i < 5; i++){
应该是
for (i = 0; i < len; i++){
并查看scanf
的页面,以免超出缓冲区
答案 2 :(得分:0)
您在12345
输入str
,'\0'
没有空格,因此 UB 。
限制str
中的输入 -
scanf("%4s", str);
这个循环 -
for (i = 0; i < 5; i++){
new_str[i] = str[i];
}
两个数组的大小均为5
,但C
中的字符串为null terminated
,因此此循环应至i=4
。
应设置new_str[4]='\0';
。