在c程序中需要有关字符串的帮助

时间:2012-09-15 09:58:42

标签: c string pointers

  

可能重复:
  Segmentation Fault - C

#include<stdio.h>
#include<string.h>
int main()
{
  char *p;

  printf("enter some thing:");
  gets(p);

  printf("you have typed:%s\n",p);
}

为什么这个程序不起作用? 我不能将指针用作字符串。

输出是:

enter some thing:raihan
Segmentation fault (core dumped)

每次使用char指针时都会出现此错误。 我怎么解决这个问题? 我在Linux mint13 KDE上使用代码块。

6 个答案:

答案 0 :(得分:3)

您尚未分配内存。您刚刚声明了一个指针p,但没有指出任何指针。这解释了分段错误。您需要为缓冲区分配内存。

更重要的是,gets不允许您指定缓冲区的大小。因此,您有可能在缓冲区的末尾运行。所以请改用fgets

int main(void)
{
    char buffer[1024];//allocates a buffer to receive the input
    printf("enter some thing: ");
    fgets(buffer, sizeof(buffer), stdin);
    printf("you have typed: %s\n", buffer);
    return 0;
}

我还更正了main的声明,并确保它返回一个值。

答案 1 :(得分:2)

您尚未为p分配任何内存。此外,使用fgets代替gets,这可能会溢出输入缓冲区。

答案 2 :(得分:2)

char *p;
printf("enter some thing:");
gets(p);

错误。 Gets()尝试填充由提供的指针指向的数组 - 并且它是segfaults,因为该指针尚未初始化,因此它可能(并且确实)指向一些垃圾/无效的内存位置。使用

char p[256];

或类似的东西 - 如果用户输入长度超过255个字符的字符串,您仍然需要担心缓冲区溢出。您可以使用

解决该问题
fgets(p, sizeof(p), stdin);

答案 3 :(得分:2)

您的指针已声明,但您尚未对其进行初始化,因此其值将是您可能无权写入的任意内存位置。因此,无论何时读取或写入此文件,您都会面临段错误的风险。使用对malloc的调用为指针分配一些堆内存,然后在写入时不会出现段错误。

答案 4 :(得分:1)

你刚刚定义了一个指针 - 没有分配字符的内存!

使用数组或malloc。

答案 5 :(得分:1)

指针只是一个内存地址。它说“你这里有一些数据”。但它实际上并没有保留这些数据。

在你的情况下问题是双重的。指针没有指向有效的内存,你甚至没有把它设置为任何东西(所以它指向某个随机的地方)。

您可以通过不同方式解决此问题。最简单的方法就是使用一个数组(它有点隐式指针):

char something[100];
printf("enter some thing:");
gets(something);

在堆栈上给你100个字符。如果你愿意,你也可以指向它,但在这种情况下它有点多余:

char *p = something;

另一种方式是动态分配,您要求操作系统在运行时为您提供一些字节数。这样你就可以在完成使用后将它还给它。

char *something = (char*)malloc( 100 * sizeof(char) );  // Ask for 100 chars
printf("enter some thing:");
gets(something);
free(something);  // Do this when you don't need that memory anymore.

PS:请记住,当你有字符串时,你总是需要一个额外的字节,而不是你想要存储的字符数。该字节用于字符串终止符,其值为0.