首先(一如既往地),我要为我的英语道歉,可能不够清晰。
我并不擅长C编程,但被要求读取一个长度未定义的“字符串”输入。
这是我的解决方案:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *newChar();
char *addChar(char *, char);
char *readLine(void);
int main() {
char *palabra;
palabra = newChar();
palabra = readLine();
printf("palabra=%s\n", palabra);
return 0;
}
char *newChar() {
char *list = (char *) malloc(0 * sizeof (char));
*list = '\0';
return list;
}
char *addChar(char *lst, char num) {
int largo = strlen(lst) + 1;
realloc(&lst, largo * sizeof (char));
*(lst + (largo - 1)) = num;
*(lst + largo) = '\0';
return lst;
}
char *readLine() {
char c;
char *palabra = newChar();
c = getchar();
while (c != '\n') {
if (c != '\n') {
palabra = addChar(palabra, c);
}
c = getchar();
}
return palabra;
}
请问,你能否帮忙告诉我这是否是一个好主意,或者给我一些其他的想法(并告诉我指针的“正确”使用方法)。
提前感谢。
编辑:好的,感谢你们的回答,它们非常有用。现在我发布了修改后(我希望更好)的代码,也许对于像我这样的新手会有所帮助,并再次得到反馈。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reChar(char **, int *);
void readLine(char **, int *);
int main() {
char *palabra = NULL;
int largo = 0;
reChar(&palabra, &largo);
readLine(&palabra, &largo);
printf("palabra=%s\n", palabra, largo);
system("pause");
return 0;
}
void reChar(char **lst, int *largo) {
(*largo) += 4;
char *temp = (char*) realloc(*lst, (*largo) * sizeof (char));
if (temp != NULL) {
*lst = temp;
} else {
free(*lst);
puts("error (re)allocating memory");
exit(1);
}
}
void readLine(char **lst, int *largo) {
int c;
int pos = 0;
c = getchar();
while (c != '\n' && c != EOF) {
if ((pos + 1) % 4 == 0) {
reChar(lst, largo);
}
(*lst)[pos] =(char) c;
pos++;
c = getchar();
}
(*lst)[pos] = '\0';
}
注:
似乎逐渐增加“palabra”的大小已经足够。
我不确定将
getchar()
捕获到一个int
,然后将其转换为char
是否是正确处理EOF陷阱的方法。
sizeof(char)
保证始终为1。与答案中可以找到的有效评论相比,这只是小问题。 - Pascal Cuoqint main()
不是main
函数的有效签名。请使用int main(void)
或者int main(int argc, char *argv[])
。 - mk12