我是C语言的初学者,我不明白为什么这段代码不起作用?
void main(){
char userInput = "a";
if(userInput == "a"){
printf("a");
} else printf("b");
getch();
}
返回“ b”
但是这个正在工作
void main(){
char userInput;
if("a" == "a"){
printf("a");
} else printf("b");
getch();
}
返回“ a”
有什么区别?
答案 0 :(得分:5)
用"a"
表示的文字是字符串文字。基本类型是char
的数组,例如char [size]
。它与char
不兼容,因此赋值
char userInput = "a";
无效。
您要使用字符常量,您编写类似
char userInput = 'a';
也就是说,if("a" == "a")
在您的情况下似乎有效,但是并没有达到您认为的目的。它不比较内容,而是比较字符串的基地址(第一个元素的地址),在您的情况下,它们似乎是相同的。您的编译器碰巧将相同内存位置用于相同的字符串文字(优化)-因此您会看到真实的结果,但这不是标准所保证的。不管有没有优化过程,编译器都可以自由选择自己的内存分配策略。
使用gcc
,如果将-fno-merge-constants用作编译选项,则此条件的评估结果为假。
答案 1 :(得分:2)
使用char userInput = "a";
,您将使用userInput
而不是字符char*
来初始化'a'
。与比较相同,您正在比较char
和char*
。
对于初始化和比较,您必须在字符周围使用单引号
void main(){
char userInput = 'a';
if(userInput == 'a'){
printf("a");
} else printf("b");
getch();
}
答案 2 :(得分:0)
用'引用字符 所以
char userInput = 'a';
if(userInput == 'a'){
答案 3 :(得分:0)
忽略无效的语法char userInput = "a"
(我认为您的意思是char*
),那么第一种情况很明显,并且是一个常见的FAQ:您不是在比较字符串的内容,而是它们的地址。参见How do I properly compare strings?
当您比较字符串的地址"a" == "a"
时,会发生相同的问题。 C中的这些只读"..."
常量被正式称为字符串常量。
编译器使用一种常见的优化技术,称为“字符串池”。字符串池意味着在程序中多次遇到相同的字符串文字时,编译器仅分配其中之一。
因此,在您的情况下,"a"
和"a"
恰好是相同的内存地址,因为实际上只分配了一个字符串文字。您可以尝试打印分配字符串文字的实际地址,并查看它们是否相同:
#include <stdio.h>
int main (void)
{
printf("%p %p", "a", "a");
}
答案 4 :(得分:0)
简化的答案:在C中,双引号内的所有内容都是字符串,即以null结尾的字符序列。单引号用于单个字符。
示例:
char c = ‘a’ ;
char *str = “string”;
答案 5 :(得分:0)
try
{
//Call Excel Converter to convert the file
//ExeClass execlass = new ExeClass();
//string path= Server.MapPath("~/App_Data/data.xlsx");
//execlass.CallExcelExeToDataTxt(path);
// Or specify a specific name in the current dir
var MyIni1 = new IniFile(Server.MapPath("~/App_Data/SettingsforExcel.ini"));
MyIni1.Write("outfile_name", Server.MapPath("~/App_Data/data.txt"));
MyIni1.Write("infile_name", Server.MapPath("~/App_Data/data.xlsx"));
//string txtfile_name = MyIni1.Read("outfile_name");
string infile_name = MyIni1.Read("infile_name");
//The connection string to the excel file
// string connstr = @"Provider=Microsoft.Jet.Oledb.4.0;Data Source=excel1.xlsx;Extended Properties=Excel 8.0";
//string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + excelpathexcelName.Replace(@"\\", "\\") + ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件
string connstr = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source= " + infile_name + ";Extended Properties='Excel 12.0; HDR=No'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)
//备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。
// "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。
//The connection to that file
OleDbConnection conn = new OleDbConnection(connstr);
//The query
string strSQL = "SELECT * FROM [data$]";
//The command
OleDbCommand cmd = new OleDbCommand(/*The query*/strSQL, /*The connection*/conn);
DataTable dt = new DataTable();
conn.Open();
try
{
OleDbDataReader dr1 = cmd.ExecuteReader();
StreamWriter sw = new StreamWriter(Server.MapPath("~/App_Data/data.txt"));
if (dr1.Read())
{
dt.Load(dr1);
}
int iColCount = dt.Columns.Count;
for (int i = 0; i < iColCount; i++)
{
sw.Write(dt.Columns[i]);
if (i < iColCount - 1)
{
sw.Write("\t");
}
}
sw.Write(sw.NewLine);
// Now write all the rows.
foreach (DataRow dr in dt.Rows)
{
for (int i = 0; i < iColCount; i++)
{
if (!Convert.IsDBNull(dr[i]))
{
if (i < iColCount - 1)
{
sw.Write(dr[i].ToString() + ";"); //add in delimiter in txt file
}
else
{
sw.Write(dr[i].ToString()); // except for the last row
}
}
//if (i < iColCount - 1)
//{
// sw.Write("\t");
//}
}
sw.Write(sw.NewLine);
}
sw.Close();
var lines = File.ReadAllLines(Server.MapPath("~/App_Data/data.txt"));
File.WriteAllLines(Server.MapPath("~/App_Data/data.txt"), lines.Skip(1).ToArray());
}
catch (OleDbException caught)
{
}
finally
{
conn.Close();
}
}
catch (Exception ex)
{
ex.Message.ToString();
}
是字符串文字,而不是字符文字,应使用单引号将其引起来,如"a"
中一样。< / p>