开发者社区> 问答> 正文

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?谢谢回答。

展开
收起
a123456678 2016-06-06 13:57:59 2495 0
1 条回答
写回答
取消 提交回答
  • 不用细看代码就知道。字符串以'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输出就不会异常。

    2019-07-17 19:28:27
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载