#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char *s;
printf("enter the string : ");
scanf("%s", s);
printf("you entered %s\n", s);
return 0;
}
当我提供长度不超过17个字符的小输入时(例如“aaaaaaaaaaaaaaaa”),程序工作得非常好但是在提供更大长度的输入时,它给我一个运行时错误,说“main.c已经意外停止工作” 。
我的编译器(codeblocks)或我的电脑(Windows 7)有问题吗?或者它是否与C的输入缓冲区有关?
答案 0 :(得分:17)
指针未初始化时, undefined behaviour 。您的编译器没有问题,但您的代码有问题:)
在将数据存储到那里之前,使s
指向有效内存。
要管理缓冲区溢出,您可以使用格式说明符指定长度:
scanf("%255s", s); // If s holds a memory of 256 bytes
// '255' should be modified as per the memory allocated.
GNU C支持非标准扩展,如果指定%as
但是应该传递指针指针,则不必分配内存,因为分配已完成:
#include<stdio.h>
#include<stdlib.h>
int main() {
char *s,*p;
s = malloc(256);
scanf("%255s", s); // Don't read more than 255 chars
printf("%s", s);
// No need to malloc `p` here
scanf("%as", &p); // GNU C library supports this type of allocate and store.
printf("%s", p);
free(s);
free(p);
return 0;
}
答案 1 :(得分:6)
char指针未初始化,你应该动态地为它分配内存,
char *s = malloc(sizeof(char) * N);
其中N是您可以阅读的最大字符串大小,并且使用scanf
是不安全的
如果没有指定输入字符串的最大长度,请使用它,
scanf("%Ns",s);
其中N与malloc相同。
答案 2 :(得分:1)
您没有为字符数组分配任何内存,因此首先尝试通过调用malloc()或calloc()来获取内存。然后尝试使用它。
s = malloc(sizeof(char) * YOUR_ARRAY_SIZE);
...do your work...
free(s);
答案 3 :(得分:1)
您需要为指针所指向的缓冲区分配足够的内存:
s = malloc(sizeof(char) * BUF_LEN);
如果您不再需要它,请释放此内存:
free(s);
答案 4 :(得分:1)
您没有为字符串分配内存,因此,您尝试在非授权的内存地址中写入内容。这里
char *s;
你只是声明一个指针。您没有指定为字符串保留多少内存。您可以静态声明:
char s[100];
将保留100个字符。如果你超过100,它仍然会因为你再次提到同样的原因而崩溃。
答案 5 :(得分:0)
问题在于您的代码..您永远不会为char *
分配内存。因为,没有分配内存(malloc()
)大到足以容纳字符串,这就变成了一个未定义的行为..
您必须为s
分配内存,然后使用scanf()
(我更喜欢fgets()
)
答案 6 :(得分:0)
在c ++中,您可以通过以下方式实现
int n;
cin>>n;
char *a=new char[n];
cin >> a;
答案 7 :(得分:0)
C语言中读取字符指针的代码
#include<stdio.h>
#include<stdlib.h>
void main()
{
char* str1;//a character pointer is created
str1 = (char*)malloc(sizeof(char)*100);//allocating memory to pointer
scanf("%[^\n]s",str1);//hence the memory is allocated now we can store the characters in allocated memory space
printf("%s",str1);
free(str1);//free the memory allocated to the pointer
}
答案 8 :(得分:0)
#include"stdio.h"
#include"malloc.h"
int main(){
char *str;
str=(char*)malloc(sizeof(char)*30);
printf("\nENTER THE STRING : ");
fgets(str,30,stdin);
printf("\nSTRING IS : %s",str);
return 0;
}