为什么字符串的scanf / printf打印不同的东西

时间:2015-08-14 17:54:40

标签: c

我知道这很简单。我在尝试之前尝试在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),但我试图理解为什么输出发生了。

3 个答案:

答案 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';