首页 > c语言用printf和puts输出字符串,结果为什么会不一样?

c语言用printf和puts输出字符串,结果为什么会不一样?

#include"stdio.h"
#include "stdlib.h"
int main(void)
{
    int width;
    int i;
    int j;
    char *word;
    char m;
    scanf("%d\n",&width);
    word=(char*)malloc(width*sizeof(char));
    for(i=0;i<width;i++){
        scanf("%c",&word[i]);
    }
    m=word[0];
    j=0;
    for(i=0;i<width;i++)
    {
        if(word[i]>m){
            m=word[i];
            j=i;
        }
    }
    for(i=0;i<width;i++){
         printf("%c",word[i]);
        if(i==j){
            printf("(max)");
        }
    }

当我输入“3(另起一行) abc”时结果为abc(max)。而当我令a[5]="(abc)"并将printf("(max)")换为puts(a)时,为什么输出为abc(max)c?谢谢回答。


不用细看代码就知道。字符串以'\0'结尾,你5个字符,分配的大小是长度为5的char数组吧?
所以不是puts、printf的问题,是你放字符串的数组中没有NULL!所以它就继续打印出栈中的其它局部变量的值,直到遇到NULL。
你代码中没有char a[5]的声明,我猜顺序也刚好在char m前面。

char a[6]="(max)" 或为什么不直接写 char *a="(max)"

还有,Linux仔仔们可能玩不出楼主这种效果来。不知道楼主用的什么编译器。
因为GCC能检查出这类字符串分配空间的问题,启用stack protector,在char a[5]后面放个canary,这个值最低位字节通常是NULL,所以保证了字符串以NULL结尾,puts输出就不会异常。

参考: http://.com/q/1010000000432116#a-1020000000432240

【热门文章】
【热门文章】