如何创建仅指向字符串第一个字母的指针

How to create a pointer to only the first letter of a string

我正在尝试使用 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"));

行已初始化为长字符串(从文件中读取)。 该行的第二个字母是 "V",所以我希望 ch = "V"。然而,这些结果显示:

test:V

通道是:VL?[?

strcmp 结果:76

同样,这段代码:

    char ch[1];
    ch[0] = line[1];
    printf("ch is: %s\n", ch);
    printf("strcmp result: %d\n", strcmp(ch, "V"));

提供了这个不正确的答案: test:V

通道是:V?

strcmp 结果:133

想知道为什么这些额外的字母会出现在 ch 中,以及一般情况下是否有更好的方法来做到这一点。我的整个程序依赖于读取和比较字符串行中的某些字母,因此这是它的重要组成部分。

感谢您的帮助。

你得到的错误是因为 ch 没有指向空终止字符串。

第一种情况:

char* ch;
ch[0] = line[1];

指针 ch 尚未初始化,但您随后取消引用指针(通过数组下标运算符 [] 隐含地)以尝试写入它。取消引用未初始化的指针会调用 undefined behavior,在您的情况下会产生意外输出。

第二种情况类似:

char ch[1];
ch[0] = line[1];

此处 ch 是一个大小为 1 的数组,您为该成员赋值。但是随后您将 ch 传递给 strcmp ,它需要一个以空字符结尾的字符串。由于数组只包含 1 个元素,因此空终止符没有 space。结果,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'));