c - 从用户那里获取字符串的更好方法

标签 c pointers char scanf fgets

我想从用户那里得到一个字符串(其实我想控制长度,但是没办法),然后输出。我尝试了一种可行的方法(但我认为这不是好的解决方案,因为它很容易溢出或占用太多内存。任何人都可以提供更好的方法吗?

#include<stdio.h>
#include<stdlib.h>

int main(){
  char p[1024];   //there if i use 'char *p=(char*)malloc(sizeof(char)*1024)' error too.
  int i=0;
  fgets(p,1024,stdin); //there if i use 'scanf("%s",p)', wrong.
  while(p[i]!='\0'&&i<1024){
    printf("%c",p[i]);
    i++;
  }
  return 0;
}

谁能提供更好的制作方法并解释我的错误? 提前致谢。

最佳答案

如果我没理解错的话,你想读入一个字符串而不用硬编码一个大小。 fgets 做不到这一点。你给它一个硬编码的大小,希望输入适合,如果输入不适合,它就会被截断。

相反,您可以使用新的(呃)getline ,如果你的编译器是 POSIX 兼容的:

#include <stdio.h>
#include <stdlib.h>
int main() {
    char *p = NULL;
    size_t size = 0;
    getline(&p, &size, stdin);
    for (int i = 0; p[i] != '\0' &&i < size; i++)
        printf("%c", p[i]);
    free(p);
    printf("size %zu",size);
    return 0;
}

这样你就不用担心缓冲区的大小了。 getline 负责这件事。您只需要在用完内存后释放内存即可。

关于c - 从用户那里获取字符串的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58537588/

相关文章:

c# - 如何枚举 NVMe (M2) 驱动器并在 c# 中获取它们的温度?

c - Libxml2:输出带有属性和内容的 XML 元素

c++ - std::vector、std::move 和指针失效

java - 表达式的类型必须是数组类型但解析为 char

Python-C 集成 : Ctypes, CFFI 或创建二进制模块

c - 全局变量似乎有两个不同的地址......?

C函数参数优化: (MyStruct const * const myStruct) vs.(MyStruct const myStruct)

c++ - 在循环中创建新的指针对象

C++ 字符串/字符和重音符号

c++ - 我可以输入检查模板参数吗? (C++)