[英]I have problem in string, in using the gets function, in c language
我在我们知道的c语言中字符串有问题,该字符串被称为空终止字符**数组,在字符串中,我们声明这个字符串存储了多少个字符。 字符的内存为1byte。 当我们声明字符名称[5]时; 这意味着字符串存储至少 4 个字符的值和空值。
但是强文本存在问题,获取功能。 当我们输入包含超过 5 个字符的名称时,它会被接受并打印所有字符。 在这种情况下,编译器不会抛出警告。
请告诉我解决方法......代码如下。
#include<stdio.h>
int main()
{
char name[4]="smti prajapati";
printf("Print the name througth the initilizing : ");
puts(name);
printf("Enter the name : ");
gets(name);
printf("Print the name througth the user : ");
puts(name);
return 0;
}
在终端程序中,看起来像这个错误
rough.c: In function 'main':
rough.c:5:18: ***warning: initializer-string for array of chars is too long***
char name[1]="smti prajapati";
^~~~~~~~~~~~~~~~
Print the name througth the initilizing : s3
Enter the name : smit prajapati
Print the name througth the user : smit prajapati
您已将name
数组声明为具有单个元素; 它不足以容纳字符串"smti prajapati"
。 您需要将name
声明为至少15 个元素宽 - 字符串中的 14 个字符加上零终止符。
您可以省略声明中的大小并写入
char name[] = "smti prajapati";
数组大小将取自初始化程序的大小。
请注意, name
的大小在定义后是固定的,并且无法存储比初始化程序更长的字符串。
不要使用gets
; 如果您输入的字符串对于数组来说太长,它会将这些额外的字符写入数组后面的任何内容。 这称为缓冲区溢出,可能导致数据损坏、运行时错误或分支到程序中的随机位置等任何事情。 缓冲区溢出是一种常见的恶意软件利用。 请改用fgets
,因为它允许您限制写入目标的字符数。
声明和赋值:
char name[1] = "smti prajapati";
永远无法工作,因为您将一个包含 14 个字符的字符串加上空字节分配给一个只有 1 个字符的空间的 char 数组。
某些格式错误的代码不会出现错误或警告的原因可以通过 C 给程序员的余地来解释,由于某些类型的格式错误的代码(例如您自己的代码),编译器不会被强制发出警告,这属于未定义行为的类别,由程序员来避免它。
你可以使用:
char name[] = "smti prajapati";
这样,数组的大小将在初始化时推导出来。
或者,如果您想明确使用尺寸:
char name[15] = "smti prajapati";
请注意,我为空字节添加了一个额外的空间,如果您想将name
作为正确的字符串处理,这是强制性的。 还要注意,一旦给了 char 数组一个大小,它就不会改变,所以当你在name
存储其他字符串时,请记住这一点。
另一个问题是gets
,你不应该使用它,它是一个非常危险的函数,它不检查目标缓冲区的边界,因此很容易导致缓冲区溢出,从而导致各种麻烦。 最近的编译器甚至不再支持它,因为它已被弃用,后来从 C 标准中删除。
即使那些仍然支持它的人也经常发出类似于以下内容的警告:
警告:`gets' 函数是危险的,不应使用。
总结和总结,使用fgets
代替:
fgets(name, sizeof name, stdin);
当您在 C 中使用数组时,您使用的是固定的内存空间。 如果我想保存“Hello World!” 在内存中,我必须保留一个长度为 13 的数组。在 C 中它看起来像:
char aString[13] = "Hello World!"
它可能高达 20,但不会低于 13。为什么? 字符串具有我们关心的字符,最后一个是空字符(其值为 0)。 因此,您需要保留 13 个字符。
在您的代码中,您只保留了 1 个字节(1 个字符)。 至少,您必须保留 15 个字节。
试试这个代码:
#include<stdio.h>
int main()
{
char name[15]="smti prajapati";
printf("Print the name througth the initilizing : ");
puts(name);
printf("Enter the name : ");
gets(name);
printf("Print the name througth the user : ");
puts(name);
return 0;
}
我编译代码没有问题。 此外,您可以不指定长度,它会正常工作。 最好的解决方案是动态内存。 避免gets()。 它有安全问题。 相反,使用 fgets()。
你有很多误解。 让我们按顺序看看它们。
在我们知道的 c 语言中,字符串被称为空终止字符**数组
在 C 中,字符串是以空char
结尾的char
数组。 使用字符指针char *
来引用字符串是很常见的。 当你说“character**”时可能是一个错字,但类型char **
是一个指向指针的指针,这是别的东西。
当我们声明字符名称[5]时; 这意味着字符串存储至少 4 个字符的值和空值。
正确的。
char name[1]="smti prajapati";
这是不正确的。 您的编译器正确警告您: warning: initializer-string for array of chars is too long
当我们输入包含超过 5 个字符的名称时,它会被接受并打印所有字符。
正确的。 有时,当您违反规则时,您就可以逃脱惩罚。
在这种情况下,编译器不会抛出警告。
正确的。 C 并不总是检测或抱怨缓冲区溢出。 通常,您有责任确保为您尝试存储在其中的字符串分配足够大的数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.