【问题标题】:About string, null character and strcmp关于字符串、空字符和strcmp
【发布时间】:2015-05-10 10:30:59
【问题描述】:

我在微控制器中创建了 C 程序,并且想将我的 C 程序中的字符串与从我的 PC 接收到的字符串进行比较,我的 PC 中的程序使用 C#,并且默认情况下 C# 中的字符串不包含空字符。

那么,我的 c 程序不会自动在从 PC 接收到的字符串中添加空字符?

strcmp函数是否可以比较2个字符串,1个字符串包含空字符,另一个不包含空字符?

【问题讨论】:

  • strcmp 要求其两个参数都以 NUL 结尾
  • 在 C 中,如果您没有初始化字符串变量,则为 null
  • 只是为了补充@CoolGuy先生的评论,string.h中的大部分函数都需要以空值结尾的参数。
  • 那么,当我的c程序从c#程序接收到字符串进行比较时,我需要手动添加空字符吗?
  • @acostela 未初始化的变量具有不确定的值。它不能保证为 0 或 NULL 或类似的东西。 (另外,C 中没有构造函数。)

标签: c strcmp null-terminated c-strings


【解决方案1】:

C 中字符串的定义(来自维基百科)是

字符串是一个连续的代码单元序列,由 第一个零码(对应 ASCII 空字符)。

也就是说,如果没有 NUL 字符,您将无法使用标准字符串函数,例如 strcmp()strcpy(),并且最终可能会损坏内存。

你可以做两件事: 在传输之前在 C# 代码中的字符串末尾添加Char.MinValue

string str = "Hello,World!" + Char.MinValue; // Add NUL.

或者您可以编写自己的字符串比较函数,例如

int myStrcmp(char* str1, char* str2, int len)
{
    int retVal = 0,

    for(int loopcnt = 0; loopcnt < len; loopcnt++)
     {

          if((*str1) > (*str2))
           {
              retVal = -1;
               break;        
           }
          else if((*str1) < (*str2))
           {
              retVal = 1;
               break;                      
           }
           str1++;
           str2++;

     }
 return retVal;
}

但是,您将需要字符串的长度。如果您已经知道长度,那么手动添加 NUL 字符会更好更快。 :-)

【讨论】:

  • 谢谢先生,也许我会使用 string str = "Hello,World!" + 字符最小值;在你的函数中,len 变量的值应该是多少?如果我想从我的 c 程序中添加空字符怎么办?
  • @AntiMafia len 是字符串的长度(你应该知道......没有 NUL)并且要在你的字符串中添加 NUL,你知道长度并且你必须在数组中获取字符串,所以添加0x00 作为数组中的下一个元素,或者在接收任何内容之前将接收缓冲区全部重置为 0x00,并在每次接收时重复它
  • 我很困惑先生。如果我想要“testing\0”的字符串,以及我想要比较的字符串“test”(不为null,因为我从pc获取字符串)。所以我会得到返回值 0?
  • 如果你传递字符串“testing”和“test”(不管NUL给这个函数)和长度为4(test的长度),你会得到0但如果你传递长度为7 (testing 的长度)你不会得到它。试着理解这段代码。
猜你喜欢
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多