我试图在动态分配输入的同时从用户那里获取输入,然后使用 strtok "拆分"它。
主要问题:
- 我得到一个"a{\300_\377"和","的无限循环。
- 为什么我会收到"隐式声明库函数"malloc"/"realoc"类型为 void"的警告
其他不太重要的问题:
3.我想中断,如果输入包含"-1",如何检查?如您所见,如果它的 1,它现在会中断。
4.In getsWordsArray()中,我想返回一个指向字符串数组的指针。由于我不知道有多少个字符串,所以我还需要像在getInput()中一样动态分配它。(我不知道每个字符串中有多少个字符)
int main(int argc, const char * argv[])
{
char input = getInput();
getWordsArray(&input);
}
char getInput()
{
char *data,*temp;
data=malloc(sizeof(char));
char c; /* c is the current character */
int i; /* i is the counter */
printf ("n Enter chars and to finish push new line:n");
for (i=0;;i++) {
c=getchar(); /* put input character into c */
if (c== '1') // need to find a way to change it to -1
break;
data[i]=c; /* put the character into the data array */
temp=realloc(data,(i+1)*sizeof(char)); /* give the pointer some memory */
if ( temp != NULL ) {
data=temp;
} else {
free(data);
printf("Error allocating memory!n");
return 0 ;
}
}
printf("list is: %sn",data); // for checking
return *data;
}
void getWordsArray(char *input)
{
char *token;
char *search = " ,";
token = strtok (input,search);
while (token != NULL ) {
printf("%sn",token);
token = strtok(NULL,search);
}
}
编辑:我注意到我忘记了"strtok"命令,所以我将其更改为token = strtok(NULL,search);
我仍然在 printf 上得到奇怪的输出:
327{300_377
更改:
int main(int argc, const char * argv[])
{
char input = getInput();
getWordsArray(&input);
}
自:
int main(int argc, const char * argv[])
{
char *input = getInput();
getWordsArray(input);
}
与返回值类似 getInput()
:
char *getInput()
{
// ...
return data;
}
在您的代码中,您只保存输入字符串的第一个字符,然后将大部分垃圾传递给getWordsArray()
。
对于您的malloc()
问题,man malloc
开头为:
SYNOPSIS
#include <stdlib.h>
对于您的getchar()
问题,也许请参阅我正在尝试理解getchar()!= EOF等。
瑟夫回答问题1。
Q2:malloc
和 realoc
返回类型 void *
。您需要将其显式转换为 char *
.试试这个:
data = (char *) malloc(sizeof(char));
Q3:1可以解释为一个字符。 -1 在转换为字符时,相当于字符串 "-1",其中包含字符 "-" 和 "1"。为了检查 -1,您需要使用 strcmp
或 strncmp
与字符串"-1"进行比较。
Q4:如果要返回其他副本,是的,动态分配内存是个好主意。或者,您可以将指向每个令牌的所有指针放入数据结构(如链表)中以供将来参考。这样,您可以避免制作副本,只允许访问字符串中的每个令牌。
错误的地方:
-
C 中的字符串以 null 结尾。
printf
%s
论点的意思是"继续打印字符,直到你达到' '
"。由于您在打印之前不会对data
进行空终止,因此printf
data
的末尾运行并仅打印堆(恰好不包含任何空字节来阻止它)。 -
你
#include
了什么标题?缺少<stdlib.h>
是隐式声明malloc
的最明显原因。 -
getInput
按值返回data
的前char
。这不是你想要的。(getWordsArray
永远行不通。另请参阅 1.)
建议:
以下是打破-1的一个想法:if ((c == '1') && (data[i-1] == '-'))
要获得字符串数组,您确实需要一个动态的char *
数组。您可以malloc
一个新字符串来复制strtok
返回的每个token
,或者直接将每个token
作为指针保存到 input
中。