尝试添加字符串和char时strcat无法正常工作?

时间:2017-05-11 00:45:48

标签: c

我第一次使用C.我每次遇到大写字母时都无法附加字符串。我知道这在大多数语言中都很简单,但我试图用C语言学习它。

 protected void Page_Load(object sender, EventArgs e)
{
    //where request_date >= DATEADD(day,-8, GETDATE())
    con.Open();
    DataTable dtTemp = new DataTable();
    cmd = new SqlCommand("SELECT request_date,prod_line,jo_no,qty,CONVERT(VARCHAR(10),need_by_date ,101) as need_by_date FROM CutPanelCard order by request_date", con);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dtTemp);

    con.Close();
    ViewState["Information"] = dtTemp;

    try
    {
        con.Open();

        {
            //DataTable dtTemp = (DataTable)ViewState["Information"];
            DataTable dtDistinctRecords = dtTemp.DefaultView.ToTable(true, "prod_line");
            DataTable dtStudentName = dtTemp.DefaultView.ToTable(true, "request_date");
            DataTable a = new DataTable();


            DataTable dtStudent = new DataTable();

            dtStudent.Columns.Add("request_date");
            foreach (DataRow rows in dtDistinctRecords.Rows)
            {
                dtStudent.Columns.Add(rows["prod_line"].ToString());
            }

            foreach (DataRow row in dtStudentName.Rows)
            {

                DataRow dr = dtStudent.NewRow();
                dr["request_date"] = row["request_date"];
                DataView dv = new DataView(dtTemp);
                dv.RowFilter = "request_date='" + row["request_date"] + "'";
                DataTable dtStudentdtl = dv.ToTable();


                for (int i = 0; i < dtStudentdtl.Rows.Count; i++)
                {
                    string colValue = dtStudentdtl.Rows[i]["jo_no"].ToString();
                    string colValue2 = dtStudentdtl.Rows[i]["qty"].ToString();
                    string colValue3 = dtStudentdtl.Rows[i]["need_by_date"].ToString();
                    dr[dtStudentdtl.Rows[i]["prod_line"].ToString()] = "JO: " + colValue + "  Quantity: " + colValue2 + "  Need by Date: " + colValue3 ;
                }
                dtStudent.Rows.InsertAt(dr, dtStudent.Rows.Count);

            }

            GridView1.DataSource = dtStudent;
            GridView1.DataBind();

           //GridView_Row_Merger(GridView1);
            GridView_Row_Merger(GridView1);
            con.Close();
        }
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
    }
}

2 个答案:

答案 0 :(得分:4)

-shudders-我现在有两个理由来抵制CS50。

  • 它似乎教你使用不合适的存储时间。
  • 它教你使用不合适的类型别名。

C11/7.1.1p1告诉我们用这个typedef声明的变量可以有意义地存储指向字符串的指针(指向字符串的指针是“指向它的初始(最低寻址)字符“如果它指向一个存储值序列的对象拟合一个非常特定的模式(字符串是 “由第一个空字符”终止并包含的连续字符序列。

您需要将指针传递给可修改的字符串作为strcat的第一个参数。就目前情况而言,你将一个指针传递给一个字符串文字作为第一个参数,正如其他人所说,这会导致未定义的行为。

这是一个可修改的字符串:

char str[128] = "hello";

实际上,那里有127个可修改的字符串,它们有指向字符串的指针,如下所示:

  • str + 0&str[0]点在第一个
  • 第二个
  • str + 1&str[1]
  • 依此类推,直到
  • 第127页
  • str + 126&str[126]
  • str + 127&str[127]指向第128位,但如果不访问str越界并导致未定义的行为,则无法更改此(空)字符串。

您可以调用fgets(str, 128, stdin)来获取字符串,该字符串可能包含换行符('\n')(如果没有,则该行不完整)...使用{删除换行符{1}}然后您可以使用str[strcspn(str, "\n")] = '\0'; ... 提供您不会溢出数组。

答案 1 :(得分:1)

strcat定义如下:char *strcat(char *dest, const char *src);这意味着它只能相互连接两个字符串。你能做什么(在现代C中)是这样的:

strcat(s1, (char[]){s[i], '\0'});

你有另一个问题; s1是一个字符串文字。尝试将其与另一个字符串连接是未定义的行为。您将需要创建一个数组或在堆上分配它才能正确使用它。

char s1[128];

char* s1 = malloc(128);

请注意,这些实现不能包含大于127个字符的字符串,您必须自己添加NUL终止。