12
#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 已意外停止工作”。

我的编译器(代码块)或我的电脑(Windows 7)有问题吗?还是它与C的输入缓冲区有某种关系?

4

9 回答 9

21

这是未定义的行为,因为指针未初始化。你的编译器没有问题,但你的代码有问题:)

在将数据存储在其中之前,请先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;
}
于 2013-02-05T12:23:55.610 回答
8

char 指针未初始化,您应该为它动态分配内存,

char *s = malloc(sizeof(char) * N);

scanf 其中 N 是您可以读取的最大字符串大小,如果不指定输入字符串的最大长度,使用它是不安全的,像这样使用它,

scanf("%Ns",s);

其中 N 与 malloc 的相同。

于 2013-02-05T12:23:16.510 回答
1

您没有为字符数组分配任何内存,因此首先尝试通过调用 malloc() 或 calloc() 来获取内存。然后尝试使用它。

s = malloc(sizeof(char) * YOUR_ARRAY_SIZE);
...do your work...
free(s);
于 2013-02-05T12:23:34.203 回答
1

您需要为指针指向的缓冲区分配足够的内存:

    s = malloc(sizeof(char) * BUF_LEN);

如果您不再需要它,则释放此内存:

    free(s);
于 2013-02-05T12:24:37.463 回答
1

您没有为字符串分配内存,因此,您正在尝试写入未经授权的内存地址。这里

char *s;

你只是在声明一个指针。您没有指定为字符串保留多少内存。您可以像这样静态声明:

char s[100];

这将保留 100 个字符。如果你超过 100,它仍然会像你提到的那样再次崩溃,原因相同。

于 2013-02-05T12:25:09.663 回答
0

问题在于您的代码..您永远不会为char *. 由于没有分配(使用malloc())足够大的内存来保存字符串,因此这成为未定义的行为。

您必须分配内存s然后使用scanf()(我更喜欢fgets()

于 2013-02-05T12:24:41.177 回答
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;
}
于 2019-07-15T13:28:38.037 回答
-1

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
 }
于 2018-11-04T08:08:45.957 回答
-2

我遇到了这个问题。我在下面尝试了这段代码,它起作用了:

char *text; 
scanf("%s", *&text); 

我不知道它是如何工作的。我只是觉得想做。

于 2022-01-11T11:41:49.997 回答