为什么我不能在strcmp()中使用并置?

问题描述 投票:1回答:4

以下代码不起作用:

char text[10];
    scanf(" %s", &text);

    if (strcmp(text, "some text") == 0)
        puts("some text");

但是当我这样更改'if part'时,一切都很好:

if (strcmp(text, "sometext") == 0)

为什么这样工作,以及如何解决?

c strcmp
4个回答
3
投票

问题不是您的strcmp通话,而是您的scanf通话!当您输入some text作为输入时,scanf将停止在第一个空格处读取,因此您的text字符串将是“ some”-因此,strcmp调用将(正确)返回非零值,因为它与[某些文本] not相同。

有关scanf,空格和%s格式的此功能的更多信息,请参见本主题:How do you allow spaces to be entered using scanf?


0
投票

调用fget读取空白,并将字符串与strncmp进行比较:

fgets (text, 100, stdin);
puts(text);
if (strncmp(text, "some text",9) == 0)
    puts("some text");

0
投票

我的答案将是不询问论坛qwuestions而是对此类问题进行排序。我需要2-3分钟才能看到发生了什么:

int main()
{
    char text[10];
    int result;
    result = scanf(" %s", &text);

    printf("scanf result: %d, scanned text: \"%s\"\n", result, text);

    if (strcmp(text, "some text") == 0)
        puts("some text");

}

调试-即找到问题的根源与编程知识同样重要。如果您自己添加此单行,则可以立即自行解决此问题。

尝试一下:https://godbolt.org/z/Tmy7PA


0
投票

主题外,但评论太久。

您的scanf行实际上是错误的(不涉及空格),您很幸运它在这里有效。您需要删除&前面的与号text。您已将text的地址传递给scanf,该地址实际上是指向char[10]的指针。对于scanf(" %s", text);text“衰减”到指向您实际想要的第一个元素(char*)的指针。在这里,恰好发生了数组(&text)的地址与数组中第一个元素(&(text[0]*(text + 0))的地址相同的情况,因为它们都自动存储在同一地点。例如,如果您有类似的东西

char* text = malloc(10);
scanf(" %s", &text);

您将通过覆盖指向malloc的内存的指针的地址开始的内存来调用未定义的行为。在这里,文本的地址是指向自动存储中的指针的地址,而实际上指向的内存则位于其他位置。您可以在以下程序中看到此说明。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char text[10];
    char* text2 = malloc(10);

    printf("address of text = %p\n", (void*)(&text));
    printf("address of text[0] = %p\n", (void*)(&(text[0])));
    printf("address of text2 = %p\n", (void*)&text2);
    printf("address of text2[0] = %p\n", (void*)(&(text2[0])));

    return 0;
}

&text == &(text[0]),表示数组的地址与数组的第一个元素的地址相等,但是&text2 != &(text2[0]),表示指针的地址不等于您的内存的第一个元素的地址'vemalloced。

此处说明:https://godbolt.org/z/N2TKvK

© www.soinside.com 2019 - 2024. All rights reserved.