如何使用scanf()在C中接受char *

时间:2015-11-26 18:59:09

标签: c string char segmentation-fault scanf

我正试图在C

中以char *的形式输入一个单词

如:

char *inputText;
scanf("%s",inputText);
printf("This is your string %s",inputText);

我尝试过使用

scanf("%s",&inputText);

同样 每次我运行它时都会遇到编译错误或分段错误

"format '%s' expects type 'char *' but argument 2 has type 'char **'

我不确定我是否遗漏了一些非常简单但却令人困惑的东西。 我的代码依赖于使用char * 如果有一种方法可以将更简单的输入方法转换为char *那么你可以告诉我那个方法吗?

2 个答案:

答案 0 :(得分:3)

你还没有初始化inputText所以它指向一些你可能甚至不拥有的随机内存。询问scanf写入该内存位置会导致未定义的行为。

您需要为指针分配内存以指向:

char *inputText = malloc(amount_of_bytes_to_allocate);

现在inputText指向已分配的内存,scanf可以愉快地写入该内存位置而不会出现段错误。请记住,当您使用分配的内存时,必须free(inputText)

但最好在这种情况下不使用动态内存(malloc),因为你可以使用自动内存做得很好:只需将inputText声明为数组而不是指针:

char inputText[size_of_array];

请记住,您的size_of_array(或amount_of_bytes_to_allocate)必须足够大才能容纳scanf将要写入数组的整个字符串,包括终止空字符。否则你将再次出现未定义的行为。

答案 1 :(得分:0)

首先,作为一般预防措施,最好初始化指向NULL的新指针,以确保它们不指向您的程序不允许访问的内存。

我会使用getline()作为scanf()的替代方法,特别是如果输入的大小可能会有所不同。它为您分配一个适当大小的缓冲区,因此您无需担心输入太多字符。

char *inputText = NULL;
int inputSize;

if (getline(&inputText, &inputSize, stdin) >= 0)
   printf("This is your string: %s\n", inputText);
else
   printf("Error\n");

你仍然需要自己释放分配给inputText的内存,所以不要忘记这样做,并在完成后将其设置为NULL