strcat
将其参数视为指向以 nul 结尾的字符串的指针。将 achar
转换为 achar *
是危险的,我无法想象它没有任何用处的理由(并不是暗示你尝试它是愚蠢的 - 每个人在学习时都会犯愚蠢的错误。这就是我们在这里的原因。)
原因是它会将单个 bytechar
以及sizeof(char*) - sizeof(char)
围绕 that 的额外(通常 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()
返回 a int
,因为EOF
被定义为超出 a 的正常范围char
。为了区分任何char
and EOF
,最好制作c
一个int
. 否则,一个完全有效的字符可能会发出信号EOF
。但是,当您将其添加到字符串时,请务必将其转换c
为 a 。char