看下面的代码:
char chs[100] = "Hello World";
char token[100];
int pos = -1;
while((current = chs[++pos]) != '"'){
strcat(token, ¤t);
}
但输出是:
H\001e\001l\001l\001o\001 \001W\001o\001r\001l\001d
有任何想法吗?
你有未定义的行为
由于您current
的未声明,我猜这是一些未初始化的字符。你
current = chs[++pos])
设置了字符,但strcat(token, ¤t);
想current
成为一个字符串,所以你在变量之后保存了一些垃圾current
。请发布更多示例代码以进行进一步分析
顺便说一句,'"'
看起来不对 C
strcat() 需要一个以空字符结尾的字符串作为输入。所以 strcat(token, ¤t) 将从当前地址开始读取并继续读取,直到找到空值。碰巧的是,您在 current 之后的内存中是“\001”,因此每次您执行 strcat 时,它都会将所有内容复制到令牌中。
你应该做 char current[] = "\0\0" 然后用 current[0] = chs[++pos] 分配它。这样,电流将始终具有该空终止。
进行最少的更改,这是您的代码的工作版本:
#include <string.h>
#include <stdio.h>
int main()
{
char current[2] = { 0x0, 0x0 }; // Will be null terminated
char chs[100] = "Hello World";
char token[100] ;
int pos = -1; // Destination of strcat must also be null terminated
token[0] = '\0' ;
// String literals does not actually have " in memory they end in \0
while((current[0] = chs[++pos]) != '\0')
{
strcat(token, ¤t[0]); // Take the address of the first char in current
}
printf("%s\n", token ) ;
return 0 ;
}
strcat
期望源和目标都是以空字符结尾的字符串。在您的情况下,它看起来就像在内存中结束后current
有\001
一个空终止符。