c - 在 char 指针中获取字符串输入

标签 c

#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 个字符的小输入时(例如“aaaaaaaaaaaaaaaaaa”),程序工作得很好,但在提供更大长度的输入时,它给我一个运行时错误,提示“main.c 意外停止工作” .

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

最佳答案

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;
}

关于c - 在 char 指针中获取字符串输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14707427/

相关文章:

c - 我调用这个函数错了吗?

c - unix网络编程select函数总是返回1(resoved)

c - 在C中,如何根据文件内容退出循环

c - (C99)在不同的宏中扩展一个宏

源文件中的代码排序 - 前向声明与 "Don' t 重复自己”?

c - 答案是 8,但如何呢?

c - 将用于分配内存的指针声明为 const 是否有缺点

c - 我的程序的代码只能运行一次并且不会循环 - 在代码块上出现错误并崩溃

c - systemcalls.h 找不到这样的文件或目录

c - C中的二进制数组压缩