在结构中输入一个字符串:分段错误

时间:2014-11-20 08:47:42

标签: c segmentation-fault scanf

到目前为止,我已经能够通过尽职的搜索来回答我所有的问题,但是这个让我感到难过。

因此。我已将此代码减少到产生错误所需的最小值。这是:

#include <studio.h>  

struct string {
      char *data;
} s;

int main(int argc, char *argv[])
{
    printf("Enter a string. ");
    scanf("%s\n", &s.data);
    printf("%s", s.data);

    return 0;
}

我使用gcc 4.6.3并使用经典的防御性编程策略使用-Wall -g进行编译。

我是通过手机发布的,因此可能存在拼写错误和自动更正错误。

6 个答案:

答案 0 :(得分:2)

使用scanf时,要使用unallocated pointer作为字符串读取,请指定'm'指令强制scanf在跳过换行符时根据需要分配内存。您负责分配给字符串的freeing the memoryscanf期望提供的指针为char**类型。

scanf ("%m[^\n]%*c", &s.data);

尾随%*c读取并丢弃尾随换行符。 (如果您只是按[enter]

,请注意这一点

答案 1 :(得分:1)

要点1.在使用之前将指针分配给指针

s.data = calloc(DATASIZE, sizeof (char));

推荐替代方案:malloc()

第2点。使用scanf()获取输入并存储它。

scanf("%s", s.data);

推荐替代方案:fgets()

以下是您的代码的更正版本。

#include <stdio.h>  
#include <stdlib.h>

#define DATASIZE 128

struct string {
      char *data;
} s;

int main(int argc, char *argv[])
{
    s.data = calloc(DATASIZE, sizeof (char));
    printf("Enter a string. \n");
    scanf("%s", s.data);
    printf("Input is : %s\n", s.data);

    return 0;
}

答案 2 :(得分:0)

首先需要使用malloc分配内存。

s.data = malloc(100);

答案 3 :(得分:0)

它在结构中的事实不是问题。问题是指针数据没有初始化,并且没有内存可以复制到的东西。

这解决了这个问题:

struct string 
{
 char data [SOMEBIGNUMBER]
} s;

这样做:保持字符串不变,但使用malloc为main中的数据分配空间。

答案 4 :(得分:0)

似乎在本声明中

("%s", s.data);

有一个错字。我想你的意思是

scanf("%s", s.data);

否则

("%s", s.data);

是一个逗号运算符的表达式,它只返回s.data。

您的代码的第一个问题是您必须在将要写入内存数据的位置分配内存。

例如

s.data = malloc( 256 * sizeof( char ) );

而不是256,你可以随意使用nay值。

第二个问题是你应该使用fgets代替scanf,因为使用最后一个是不安全的。

所以主要看起来像

int main( void )
{
    const size_t N = 256;

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

    s.data[0] = '\0';

    printf("Enter a string (no more than %zu characters). ", N );
    fgets( s.data, N, stdin );

    printf("%s\n", s.data);

    free( s.data );

    return 0;
}

此外,您可以删除fgets后将存储在data.s中的新行字符。

例如

size_t len = strlen( s.data );
if ( len && s.data[len - 1] == '\n' ) s.data[len - 1] = '\0';

答案 5 :(得分:0)

在此使用malloc进行内存分配结构对象和char指针。 下面是更正后的代码......

#include <stdio.h>
#include <malloc.h>

struct string {
  char *data;
} *s;
int main(int argc, char *argv[])
{
   s = (struct string*)malloc(sizeof(struct string));
   s->data = (char*)malloc(sizeof(char) * 100);

   printf("Enter a string : ");
   scanf("%s", s->data);
   printf("%s\n", s->data);

   return 0;
}