首先(一如既往)我想道歉我的英语,它可能不够清楚。阅读字符串C中未定义的长度
我不擅长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;
}
请,我会很感激你帮助我,告诉我,如果这是一个好主意,或者给我一些其他的想法(也告诉我,如果这是一个“正确的”用于指针)。
在此先感谢
编辑:嗯,谢谢你的回答,他们是非常有用的。现在我发布了编辑(我希望更好)的代码,也许可以对新来C的人有用(像我一样)并再次被反馈。
#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';
}
PS:
这似乎够慢的 “言论报” 增加大小。
我不知道如果捕获
getchar()
为int
,然后将它转换成一个char
是正确的方式来hadle EOF pitfall
'sizeof(char)'保证始终为1.与您在答案中找到的有效备注相比,这是微不足道的。 – 2010-08-30 07:49:45
'int main()'不是main的有效签名。使用'int main(void)'或'int main(int argc,char * argv [])''。 – mk12 2012-08-26 01:55:10