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 缓冲区(作为指向其第一个元素的指针),然后函数填充该缓冲区。
scanf
和 printf
的问题是格式字符串后的参数是可变的,这意味着它们将接受任何参数而不进行类型检查。好处是大多数编译器可以判断格式字符串是否与参数匹配,并且会发出警告,如果您启用它们。帮自己一个忙,去做吧。
(警告还会告诉您在参数类型已知的函数中存在类型不匹配,例如您的 is_bigger_than_10
。)
:) 我试图在 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 缓冲区(作为指向其第一个元素的指针),然后函数填充该缓冲区。
scanf
和 printf
的问题是格式字符串后的参数是可变的,这意味着它们将接受任何参数而不进行类型检查。好处是大多数编译器可以判断格式字符串是否与参数匹配,并且会发出警告,如果您启用它们。帮自己一个忙,去做吧。
(警告还会告诉您在参数类型已知的函数中存在类型不匹配,例如您的 is_bigger_than_10
。)