1

看下面的代码:

char chs[100] = "Hello World";
char token[100];
int pos = -1;
while((current = chs[++pos]) != '"'){
      strcat(token, &current);
}

但输出是:

H\001e\001l\001l\001o\001 \001W\001o\001r\001l\001d

有任何想法吗?

4

3 回答 3

2

你有未定义的行为

由于您current的未声明,我猜这是一些未初始化的字符。你 current = chs[++pos])设置了字符,但strcat(token, &current);current成为一个字符串,所以你在变量之后保存了一些垃圾current。请发布更多示例代码以进行进一步分析

顺便说一句,'"'看起来不对 C

于 2013-05-26T02:08:59.790 回答
2

strcat() 需要一个以空字符结尾的字符串作为输入。所以 strcat(token, ¤t) 将从当前地址开始读取并继续读取,直到找到空值。碰巧的是,您在 current 之后的内存中是“\001”,因此每次您执行 strcat 时,它都会将所有内容复制到令牌中。

你应该做 char current[] = "\0\0" 然后用 current[0] = chs[++pos] 分配它。这样,电流将始终具有该空终止。

于 2013-05-26T02:09:31.810 回答
0

进行最少的更改,这是您的代码的工作版本:

#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, &current[0]); // Take the address of the first char in current                      
    }   

    printf("%s\n", token ) ;

    return 0 ;
}

strcat期望源和目标都是以空字符结尾的字符串。在您的情况下,它看起来就像在内存中结束后current\001一个空终止符。

于 2013-05-26T02:26:05.423 回答