C指针字符串存在问题

时间:2018-10-21 18:55:16

标签: c string function pointers strlen

:) 我试图在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
字符串字符:
a x e l
现在让我们检查它是否大于10
a x e l-> 4> 10
答案是:0

如果您运行该代码并输入 axel 作为输入字符串,您将获得以下信息:

初始字符串:$ 0 @
大小为3:
给我一个字符串:axel
您写道:axel
字符串字符:a b c d e
a x e l
现在让我们检查它是否大于10
 '-> 3> 10
答案是:0

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

1 个答案:

答案 0 :(得分:0)

这里发生了两件事:

首先,您的char指针需要指向某处。与线

char *string1 = "";

创建一个指向字符串文字的指针,该文字不能写入。 (显然,您可以给定输出,但是在允许它的系统上很幸运。)相反,创建一个字符缓冲区:

char string1[200] = "";

,理想情况下,在读取字符串时强制执行常量缓冲区限制。

第二,您不需要所有这些&&并不是必须放在所有论点之前的魔术标记。

&接收变量的地址,并将其作为指针传递。当被调用的函数需要通过指针更改变量时,您需要这样做。打印不需要更改任何内容,因此,除非要使用%p打印变量的地址,否则不应该传递地址。 (在程序的特殊情况下,只需搜索并替换所有与号即可。)

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

scanfprintf的问题在于格式字符串后面的参数是可变参数,这意味着它们将接受任何类型的参数而无需类型检查。好处是,大多数编译器可以告诉您格式字符串是否与参数匹配,并且在启用它们后会发出警告。帮自己一个忙,那样做。

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