如果Else落入C中的变量

时间:2018-09-24 10:24:53

标签: c string comparison-operators

我是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”

有什么区别?

6 个答案:

答案 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'。与比较相同,您正在比较charchar*

对于初始化和比较,您必须在字符周围使用单引号

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>