如何在C中用用户输入来创建字符串函数?

我知道如何使用int,double,float和内部用户输入来创建函数(我当前正在使用scanf)。

int getData(){ int a; scanf("%i",&a); return a; } 

但如何使用字符串类型和用户输入内部函数,然后我们返回类型字符串的值?

AC字符串是由NUL(零)字节终止的char数组。 数组通常作为指向第一个元素的指针传递。 从函数返回的问题是指向的地址必须在函数的生命周期之后保持有效,这意味着它需要是一个static缓冲区(然后被同一函数的任何后续调用覆盖,之前就会破坏)返回值)或由函数分配,在这种情况下,调用者负责释放它。

你提到的scanf对于读取交互式用户输入也是有问题的,例如,它可能使输入处于意外状态,例如当你在下一次调用scanf时没有在行尾消​​耗换行符时(可能是不相关的)函数)在遇到换行符时可能会令人惊讶地无法给出预期的结果。

将输入逐行读取到缓冲区(例如,使用fgets )通常更简单,然后从那里解析该行。 (有些输入你可以简单地逐个字符地阅读而无需缓冲区来解析,但是这样的代码经常变得很长而很难快速跟进。)

读取任何字符串(可能包含换行符以外的空格)的示例如下所示:

 /// Read a line from stdin and return a `malloc`ed copy of it without /// the trailing newline. The caller is responsible for `free`ing it. char *readNewString(void) { char buffer[1024]; if (!fgets(buffer, sizeof buffer, stdin)) { return NULL; // read failed, eg, EOF } int len = strlen(buffer); if (len > 0 && buffer[len - 1] == '\n') { buffer[--len] = '\0'; // remove the newline // You may also wish to remove trailing and/or leading whitespace } else { // Invalid input // // Depending on the context you may wish to eg, // consume input until newline/EOF or abort. } char *str = malloc(len + 1); if (!str) { return NULL; // out of memory (unlikely) } return strcpy(str, buffer); // or use `memcpy` but then be careful with length } 

另一种选择是让调用者提供缓冲区及其大小,然后在成功时返回相同的缓冲区,并在失败时返回NULL 。 这种方法的优点在于调用者可以决定何时重用缓冲区以及字符串是否需要被复制或只是读取一次并被遗忘。

Arkku的方法扩展到无限大小(实际上它仅限于SIZE_MAX – 1个字符)作为输入:

 #include  #include  #define BUFFER_MAX (256) int read_string(FILE * pf, char ** ps) { int result = 0; if (!ps) { result = -1; errno = EINVAL; } else { char buffer[BUFFER_MAX]; size_t len = 0; *ps = NULL; while (NULL != fgets(buffer, sizeof buffer, pf)) { len += strlen(buffer); { void * p = realloc(*ps, len + 1); if (!p) { int es = errno; result = -1; free(*ps); errno = es; break; } *ps = p; } strcpy(&(*ps)[len], buffer); } if (ferror(pf)) { result = -1; } } return result; } 

这样叫:

 #include  #include  int read_string(FILE * pf, char ** ps); int main(void); { char * p; if (-1 == read_string(stdin, &p)) /* This read from standard input, still any FILE* would do here. */ { perror("read_string() failed"); exit(EXIT_FAILURE); } printf("Read: '%s'\n", p); free(p); /* Clean up. */ }