C - 使用typedef时如何从用户获取字符串?

时间:2017-11-16 19:33:36

标签: c pointers scanf fgets

我的代码中有以下typedef:

typedef char * string;

我需要让用户输入一个字符串,以便我可以解析它并稍后使用这些内容。如果我只是声明一个带有这个定义的字符串,它就会起作用,如下所示:

string bob = "My name is bob!;
printf("%s\n", bob);

使用它时,我应该使用什么来获取用户输入,scanf()和fgets() 当我尝试使用它们时,它们都会给我分段错误(核心转储)错误。

这是针对学校的,这就是我需要以这种方式使用typedef的原因。

3 个答案:

答案 0 :(得分:0)

您可以typedef pointer variable但在使用或访问typedefed pointer variable时必须小心,因为通常您不会在{{1}中看到*符号}}和declaration可能在其他地方,您可以将其视为正常变量。

如果你想从运行时或从文件中获取指针变量的输入,你应该分配内存。

definition

上面的代码会导致分段错误,所以首先动态分配内存。

int main()
    {
            typedef char * string;// now string also a char pointer
            string bob;// bob is pointer variable
            printf("enter the string\n");
            scanf("%s",bob);//bob is uninitialized pointer .. u can't put any data
            printf("%s\n", bob);
          //once job is done free dynamically allocated memory using free function 
    }

答案 1 :(得分:0)

那是因为你必须设定起始值 假设您有char * a;
a具有未定义的值,可能指向未经授权的区域。你不能写在那里。

你该怎么办?如果必须使用typedef char * string;,则必须将其写入:
1)动态堆,2)堆栈缓冲区。

1)使用malloc - 必须包含在stdlib.h中的函数,并在动态堆中分配内存。该函数返回指向已分配内存开头的指针。
通过free()功能,在使用它来释放分配的内存以避免泄漏后,请不要忘记。

2)声明字符的预定数组大小,并将其地址赋予变量。

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

#define MY_SIZE 50
typedef char * string;

int main() {
    string s;

    // 1)
    s = malloc(MY_SIZE);
    // some code
    free(s);

    // 2)
    char buf[MY_SIZE];
    s = buf;

    return 0;
}

你必须练习两种方式。
希望我能帮助你!

答案 2 :(得分:0)

  

使用typedef时如何从用户获取字符串? (typedef char * string;

需要为

string bob分配一个值,内存位置用于存储读取的数据。

#define N 80 

// local array
char buf[N];
string bob = buf;
fgets(bob, N, stdin); 

// or malloc
string bob = malloc(N);
if (bob == NULL) Handle_OutOfMemory(); 
fgets(bob, N, stdin); 

现在修剪潜在的'\n'

bob[strcspn(bob, "\n")] = '\0';

打印结果

printf("<%s>\n", bob);
  

...稍后再使用这些内容。

这意味着代码应使用正确大小的内存分配,以便很好地传递此输入代码。 strdup()不在标准C库中,但非常常见。  Sample code

 // local array approach
 bob = strdup(bob);
 // Now bob points to allocated memory

 // malloc approach
 // re-size to be efficient
 void *t = realloc(bob, strlen(bob) + 1);
 if (t) {
   bob = t;
 }
 // Detail: A realloc to a smaller amount of memory rarely ever fails.
 // If it did fail, just continue with old pointer.

如果bob指向已分配的内存,请在完成bob后进行清理。

free(bob);

如果需要,只能使用scanf(),您不能放弃课程或在其他地方就业。