在printf中使用%c和循环与%s的不同结果,以空终止字符串

时间:2011-01-14 14:28:03

标签: c string printf

我有一个变量'jmp_code',它被声明为char *。当我运行以下命令时

printf("char by char, the code is '%c%c%c%c'\n", *jmp_code, *(jmp_code+1), *(jmp_code+2),*(jmp_code+3));
printf("printing the string, the code is '%s'\n", jmp_code);

我得到以下结果

char by char, the code is '0,0,0, ,'
printing the string, the code is 'ö\├w≡F┴w'

我正在使用代码块。这是我正在玩的示例代码。

#include <stdio.h>
#include <string.h>

char * some_func(char * code);

char * some_func(char * code) {

    char char_array[4];

    strcpy(char_array, "000");

    code = char_array;

    return code;

}
int main ( void ) {

    char * jmp_code = NULL;

    jmp_code = some_func(jmp_code);

    printf("char by char, the code is '%c,%c,%c,%c,'\n", *jmp_code, *(jmp_code+1), *(jmp_code+2),*(jmp_code+3));
    printf("printing the string, the code is '%s'\n", jmp_code);

    return 0;

}

我很困惑。任何帮助将不胜感激。

由于

5 个答案:

答案 0 :(得分:4)

一些快速观察:

char * some_func(char * code) {
    char char_array[4];
    strcpy(char_array, "000");
    code = char_array;
    return code;
}

你无法在C中使用=分配字符串。这会让事情变得混乱 - 你将本地分配的char_array的指针代码分配给代码,但你没有复制内容记忆。另请注意,由于char_array已在堆栈上(通常)分配,因此当您从该函数返回时,它会发现它会消失。您可以使用static关键字解决这个问题,但我认为这不是最好的解决方案。你应该使用类似的东西(大警告这个例子不是很大的安全,你需要检查字符串长度,但为了简洁起见):

void some_func(char * code) {
    strcpy(code, "000");
    return;
}

(有关安全字符串处理建议,请参阅this(和this)。

并通过main中的some_func(jmp_code)进行调用。如果您不确定这是做什么的,请阅读pointers

第二个问题。

char * jmp_code = NULL;

目前,您已经声明了足够的空间来指向char类型的指针。如果您想使用上面的建议,则需要使用malloc()free(),否则请声明char jmp_code[4],以便分配空间。

我认为发生了什么?好吧,在我的系统上,我得到了:

  

代码是'0,0,0 ,,'和代码   是''

但我认为jmp_code有可能指向some_func函数提供的堆栈上的零。我认为在您的系统上数据已被覆盖。

相反,您正在阅读终端解释为所述字符的信息。阅读字符编码。我特别建议从The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

开始

答案 1 :(得分:2)

可能有趣的是看到:

const char *pos = jmp_code;
while (*pos)
    printf("%d ", *pos++);

答案 2 :(得分:2)

您正在返回对临时数组的引用。当char_array返回时some_func()消失,但您继续使用它的地址。您需要使用malloc()分配数组,然后在使用它之后使用free()

答案 3 :(得分:2)

您是从无效指针打印的。 char_array位于some_func()函数的堆栈中 该函数返回堆栈中某些东西的指针,并且在函数返回后不再有! 第一个printf发现堆栈仍然没有改变,第二个可能发现它充满了......垃圾!

答案 4 :(得分:1)

我认为 char 类型不能使用非ascii 字符代码。这意味着您的字符串包含UTF-8或类似符号,其代码可以在(0,over9000)范围内,而char代码可以在(0,255)范围内。< / p>