我第一次使用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);
}
}
答案 0 :(得分:4)
-shudders-我现在有两个理由来抵制CS50。
C11/7.1.1p1告诉我们用这个typedef
声明的变量可以有意义地存储指向字符串的指针(指向字符串的指针是“指向它的初始(最低寻址)字符“)如果它指向一个存储值序列的对象拟合一个非常特定的模式(字符串是 “由第一个空字符”终止并包含的连续字符序列。
您需要将指针传递给可修改的字符串作为strcat
的第一个参数。就目前情况而言,你将一个指针传递给一个字符串文字作为第一个参数,正如其他人所说,这会导致未定义的行为。
这是一个可修改的字符串:
char str[128] = "hello";
实际上,那里有127个可修改的字符串,它们有指向字符串的指针,如下所示:
str + 0
或&str[0]
点在第一个str + 1
或&str[1]
点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终止。