假设我有一个 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
函数添加一些其他评论:
char* inp = "";
将指向只读数据。 C 标准中的一个缺陷(为了向后兼容)允许将字符串文字分配给char*
类型而不是const char *
类型(恕我直言)。
有几种方法可以解决这个问题,但最好的方法是动态分配。使用malloc
函数保留一些数据,跟踪您在函数中使用了多少,如果最终需要更多空间来存储,请使用realloc
函数它。如果您需要这方面的帮助,我相信您会带着另一个问题回到这里(希望太快)。 :)getchar()
返回一个int
,因为EOF
被定义为超出char
的正常范围>。为了区分任何char
和EOF
,最好使c
成为int
。否则,完全有效的字符可能会发出EOF
信号。不过,在将c
添加到字符串时,请务必将其转换为char
。
关于将 char 转换为 char 数组或将 char 数组转换为 char?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4687587/