在char指针中输入字符串

时间:2013-02-05 12:20:39

标签: 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个字符的小输入时(例如“aaaaaaaaaaaaaaaa”),程序工作得非常好但是在提供更大长度的输入时,它给我一个运行时错误,说“main.c已经意外停止工作” 。

我的编译器(codeblocks)或我的电脑(Windows 7)有问题吗?或者它是否与C的输入缓冲区有关?

9 个答案:

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