我正在尝试使用 strcmp() 将字符串行的第一个字母(应该是“V”)与 c 中的字母“V”进行比较。
我尝试了几种不同的方法来尝试创建仅指向字符串第一个字母的指针以便用于比较。我最新的解决方案似乎效果更好,但在初始分配后添加了一些字母串。
printf("test:%c ", line[1]);
char* ch;
ch[0] = line[1];
printf("ch is: %s\n", ch);
printf("strcmp result: %d\n", strcmp(ch, "V"));
line 已初始化为长字符串(从文件中读取)。 该行的第二个字母是“V”,所以我期望 ch =“V”。然而,这些结果显示:
测试:V
ch 是:VL?[?
strcmp 结果:76
类似地,这段代码:
char ch[1];
ch[0] = line[1];
printf("ch is: %s\n", ch);
printf("strcmp result: %d\n", strcmp(ch, "V"));
提供了这个错误答案: 测试:V
ch 是:V?
strcmp 结果:133
想知道为什么这些额外的字母会出现在 ch 中,以及是否有更好的方法来做到这一点。我的整个程序依赖于读取和比较字符串行中的某些字母,因此这是它的重要组成部分。
感谢您的帮助。
最佳答案
您收到的错误是因为 ch
未指向以 null 结尾的字符串。
第一种情况:
char* ch;
ch[0] = line[1];
指针ch
尚未初始化,但您随后取消引用该指针(通过数组下标运算符[]
隐式地进行)以尝试写入它。取消引用未初始化的指针会调用 undefined behavior ,在您的情况下会产生意外的输出。
第二种情况类似:
char ch[1];
ch[0] = line[1];
这里 ch
是一个大小为 1 的数组,您可以为该成员分配一个值。但随后您将 ch
传递给 strcmp
,它需要一个以 null 结尾的字符串。由于数组仅包含 1 个元素,因此没有空间用于空终止符。结果,strcmp
读取数组末尾以查找一个。读取超出数组末尾的内容也会调用未定义的行为。
要进行正确的字符串比较,数组必须有空间容纳相关字符串,这意味着大小必须至少为 2:
char ch[2];
ch[0] = line[1];
ch[1] = 0;
但是,您的目标不是比较字符串。您想比较单个字符。为此,只需使用单引号来表示字符常量并将其直接与相关元素进行比较:
printf("test:%c ", line[1]);
printf("strcmp result: %d\n", (line[1] == 'V'));
关于c - 如何创建仅指向字符串第一个字母的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57080733/