【问题标题】:problems with c pointer stringsc指针字符串的问题
【发布时间】:2018-10-21 18:55:15
【问题描述】:

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

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

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

这有点奇怪,谁能帮我更正这段代码?

【问题讨论】:

  • 如果您打开警告,您应该会收到很多关于您过度使用 &amp; 运算符的警告。
  • 您的字符串是数组,因此是指针,因此您不需要使用它们的地址来引用它们进行 printf 等。
  • @MandyShaw -- 数组不是指针;数组标识符 decay 在大多数表达式中(例如在函数调用中)指向其关联数组的第一个元素的指针,但数组在 C 中是对象。

标签: c string function pointers strlen


【解决方案1】:

这里发生了两件事:

首先,你的 char 指针需要指向某个地方。随着线

char *string1 = "";

您创建了一个指向字符串文字的指针,您无法写入该指针。 (显然你可以,鉴于你的输出,但你只是幸运的系统允许它。)创建一个字符缓冲区:

char string1[200] = "";

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

其次,您不需要所有这些&amp;s。 &amp; 不是一个魔法标记,您必须将其添加到所有参数中。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多