c指针字符串的问题

problems with c pointer strings

:) 我试图在 c 中击败字符串指针,所以我写了这段代码,但没有得到我预期的结果。

我正在创建一个字符串变量,我想将它传递给一个检查字符串长度是否大于 10 的函数。

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
bool is_bigger_than_10(char *);

int main()
{
    char *string1 = "";
    int i = 0;
    printf("Initial string: %s\n",&string1);
    printf("Size is: %d\n",strlen(&string1));
    printf("Give me one string: ");
    scanf("%[^\t\n]s",&string1);  //This scan allows me to enter string with spaces

    printf("You write: %s\n", &string1);
    printf("Size is: %d\n",strlen(&string1));
    printf("String character by character:\n");
    for(i = 0; i < strlen(&string1) ; i++)
    {
        printf("%c ",&string1[i]);
    }

    printf("\nNow let's check if it's bigger than 10\n");
    printf("Answer is: %d",is_bigger_than_10(&string1));

    return 0;
}

bool is_bigger_than_10(char *textx)
{
    printf("%s --> %d > %d\n",&textx, strlen(&textx),10);
    if(strlen(&textx) > 10)
    {
        return true;
    }
    else
    {
        return false;
    }
}

预期的输出应该是:

初始字符串:
大小为 0:
给我一根绳子:axel
你写:axel
逐个字符的字符串:
一个 x e l
现在让我们检查它是否大于 10
一个 x e l --> 4 > 10
答案是:0

如果 yoy 运行 该代码并输入 axel 作为输入字符串,您将得到:

初始字符串:$0@
尺寸为 3:
给我一根绳子:axel
你写:axel
逐个字符的字符串:a b c d e
一个 x e l
现在让我们检查它是否大于 10
' --> 3 > 10
答案是:0

有点奇怪,有人可以帮我更正这段代码吗?

这里发生了两件事:

首先,您的字符指针需要指向某处。随着行

char *string1 = "";

您创建了一个指向您无法写入的字符串文字的指针。 (显然你可以,给定你的输出,但你只是运气好在一个允许它的系统上。)改为创建一个字符缓冲区:

char string1[200] = "";

最好在读取字符串时强制执行常量缓冲区限制。

其次,您不需要所有这些 && 不是您必须在所有参数前添加的神奇标记。

& 获取变量的地址并将其作为指针传递。当被调用函数需要通过指针更改变量时,您需要它。打印不需要改变任何东西,所以除非你想用 %p 打印一个变量的地址,否则你不应该传递地址。 (在您的程序的特殊情况下,您可以使用搜索和替换删除所有与号。)

扫描时,如果将输入转换为数字或扫描字符,则需要更改变量。例外情况是当您使用 %s%[...] 扫描字符串时:在这里,您传递一个 char 缓冲区(作为指向其第一个元素的指针),然后函数填充该缓冲区。

scanfprintf 的问题是格式字符串后的参数是可变的,这意味着它们将接受任何参数而不进行类型检查。好处是大多数编译器可以判断格式字符串是否与参数匹配,并且会发出警告,如果您启用它们。帮自己一个忙,去做吧。

(警告还会告诉您在参数类型已知的函数中存在类型不匹配,例如您的 is_bigger_than_10。)