我正试图在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 *那么你可以告诉我那个方法吗?
答案 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
。