- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有一个 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/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
当我尝试运行以下代码时,List(.of) 无法编译并给出主题错误。 package collections; import java.util.LinkedHashSet; import java.
我正在尝试编译使用 ChatScript 库的程序。这是我在名为 main.cpp 的文件中的代码: #include #include "common.h" using namespace std
我想在我的程序中外部使用 ChatScript。在documents它说: Embedding Step #1 First, you will need to modify `common.h and
假设我有一个 char,我想用一行代码将其 strcat() 转换为 char 数组。对于 [一个非实用的] 示例: strcat("ljsdflusdfg",getchar()); 或者我想做相反的
我有以下类型签名: *Main Lib> let f :: a -> a -> a -> a; f = undefined *Main Lib> let x :: Char; x = undefin
我正在学习如何在 C 中使用指针(使用 malloc 和 free),但我在这个练习中遇到了一些麻烦。我只想制作一个指针数组,我想在其中保存每个单词的方向。然后我想为一个特定的词做一个 free(),
我有一个字符*: char* version = "10.5.108"; 我想通过字符分隔符获取两个新的 char*。 char delimiter = '.'; 执行以下代码后: printf("|
最近在学习Cpp,今天在学习使用Clion做测试的时候,发生了奇怪的事情。 这是我的代码 int main() { char c = 'b'; char carr[1]{'a'};
我对 c 很陌生,我正在审查一些代码。我遇到了这个: static char * fromDataType; static char * toDataType; static char * fromR
我有一个像这样的动态结构: struct network { int count; char** ips; } 如果我知道每个字符串数组都是 16 个字节(即 INET_ADDRSTR
我有一个旧程序,其中使用了一些库函数,但我没有那个库。 所以我正在使用 C++ 库编写该程序。在那个旧代码中有一些函数是这样调用的 *string = newstrdup("这里有一些字符串"); 字
我正在编写一个函数,该函数接受 ArrayList,然后将每个 char[] 复制到另一个增加长度的 char[] 中,然后将新的 char[] 添加到新的 ArrayList 中。当我尝试复制数组时
我正在寻找 map >并生成每个可能的 map从它。 我知道这可能会占用大量内存并需要一些时间。 每个map需要包含每个字母 a-z,并映射到唯一的 a-z 字符。 IE。啊bjcp迪EVfh嘎血红蛋
#define NAME_LEN 20 #include "stdio.h" #include "stdlib.h" #include "string.h" #pragma warning(disab
所以我必须创建一个函数来找到一对带有第一个字母并返回第二个字母的函数。 我实际上找到了一个答案,但是使用 map 功能却找不到。 lookUp :: Char -> [(Char, Cha
我最近接受采访并要求写mystrcat(*s1, *s2, *s3) 其中s1 和s2 是源字符串连接结果由 s3 给出。有人告诉我,不要担心 s3 的内存分配,并假设 s1 和 s2 不是空/无效字
今天我与一位同事讨论了他(对我来说)不寻常的“main”函数签名。他喜欢这样声明: int main(int argc, char* (*argv)[]) { printf("at index
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: What's the difference between new char[10] and new cha
通常字符串文字是 const char[] 类型。但是当我把它当作其他类型时,我得到了奇怪的结果。 unsigned char *a = "\355\1\23"; 使用此编译器会抛出警告“初始化中的指
我是一名优秀的程序员,十分优秀!