将 char 转换为 char 数组或将 char 数组转换为 char?

标签 c string char c89 concat

假设我有一个 char,我想用一行代码将其 strcat() 转换为 char 数组。对于 [一个非实用的] 示例:

strcat("ljsdflusdfg",getchar());

或者我想做相反的事情,无论数据类型如何,连接或类型转换字符串的合适函数是什么?或者我可能缺少一些语法......

这是一个例子。它编译得很好但崩溃了。

char* input(){
 char* inp="";
 while(1){
  char c=getchar();
  if(c){
   if(c=='\n'||c==EOF){
    break;
   }else{
    strcat(inp,(char*)c);
   }
  }
 }
 return inp;
}

最佳答案

strcat 将其参数视为指向以 nul 结尾的字符串的指针。将 char 转换为 char * 是很危险的,我可以想象没有理由它会有用(并不是说你尝试它是愚蠢的 - 每个人他们在学习时会犯愚蠢的错误。这就是我们在这里的原因。)

原因是它会解释单字节 char,加上额外的 sizeof(char*) - sizeof(char)(通常是 3)字节围绕 char,作为指针,可以指向...任何地方。您无法知道它指向何处,因为其中 3 个字节超出您的控制范围,因此无法知道它是否指向有效数据。

您可以将此作为第二种方法:

strcat(inp, &c);

这一次,你会做得更好,因为 &c 是一个类型为 char * 的表达式并且不需要转换。但同样,strcat 假设它的参数是一个以 nul 结尾的字符串,并且由于您无法保证在 char 数据之后有一个 nul 字节,所以这是行不通的。

最好的方法是这样的:

size_t len = strlen(inp); // this may already be calculated somewhere else
...
inp[len++] = c; // add c as the last character, and adjust our len
inp[len] = '\0'; // add a new nul terminator to our string

更新:

其实,我撒谎了。 最好的 方法是使用标准库函数 fgets ,这似乎或多或少地在做你想做的事情。老实说我忘记了,但如果这是家庭作业,您的教授可能不希望您使用 fgets 以便您可以学习如何手动完成。但是,如果这不是家庭作业,fgets 将完全满足您的需求。 (实际上,第三种方法正在重新实现 fgets 或类似 fgets 的功能。)

我还会对您的 input 函数添加一些其他评论:

  1. char* inp = ""; 将指向只读数据。 C 标准中的一个缺陷(为了向后兼容)允许将字符串文字分配给 char* 类型而不是 const char * 类型(恕我直言)。

    有几种方法可以解决这个问题,但最好的方法是动态分配。使用 malloc 函数保留一些数据,跟踪您在函数中使用了多少,如果最终需要更多空间来存储,请使用 realloc 函数它。如果您需要这方面的帮助,我相信您会带着另一个问题回到这里(希望太快)。 :)
  2. getchar() 返回一个 int,因为 EOF 被定义为超出 char 的正常范围>。为了区分任何 charEOF,最好使 c 成为 int。否则,完全有效的字符可能会发出 EOF 信号。不过,在将 c 添加到字符串时,请务必将其转换为 char

关于将 char 转换为 char 数组或将 char 数组转换为 char?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4687587/

相关文章:

C 开关语句

c - `scanf` 应该如何处理不完整的指数部分?

javascript - 如何判断字母是否在字符串中-javascript

java - 在与正则表达式匹配的字符串中查找一些文本

c - 从产生奇怪输出的字符串中删除字符

使用指针更改原始字符串的值

c++ - C - 在 main() 结束之前/之后运行函数

c - ARM 项目中的板支持库链接错误

Java - 读取/扫描文本文件的字符串长度并在程序中使用它

c++ - 写入文本文件,二进制与 ascii