| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 458 人关注过本帖
标题:关于sizeof( )函数的问题
只看楼主 加入收藏
_Dennis_h
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2015-3-6
结帖率:90.91%
收藏
已结贴  问题点数:20 回复次数:5 
关于sizeof( )函数的问题
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define  _STD_WANT_LIB_EXT1_ 1
#define  Count   5
#define  buf_len  100


int main(void)
{
    char buf[buf_len] = {'0'};  // input buffer 
    int str_count = 0;          // string 1st count = 0
    int str_len = 0;            // string current length
    int outp_str_len = 0;       // output string length
    int str_max = Count;        // max count input string
    char** ptemp = NULL;
    char** ps = (char**)calloc(str_max, sizeof(char*));//5 * char* = 40 byte

    do
    {
        printf("input string you want (less than %d wards):", buf_len);
        fflush(stdin);
        char* ptest = (char*)gets_s(buf, sizeof(buf));
        if(ptest == NULL)
        {
            printf("gets_s() error\n");
            free(ps);
            ps = NULL;
            //free(ptest);
            //ptest = NULL;
            return 1;
        }
        //printf("%s\n", buf);
        else if(buf[0] == '0')
        {
            printf("You input nothing!!!\n");
            break;
        }
        else if(str_count == str_max)
        {
            str_max += str_count/4;         //add 25% merry
            ptemp = realloc(ps, str_max);
            if(ptemp == NULL)
            {
                printf("realloc() error\n");
                return 2;
            }
            ps = ptemp;
        }
        str_len = strnlen_s(buf, sizeof(buf)) + 1;// buf current length must <= buf_len
        ps[str_count] = malloc(str_len);       //allocation current merry to ps[...]
        if(ps[str_count] == NULL)
        {
            printf("error malloc() error!!!\n");
            return 3;
        }
        strcpy_s(ps[str_count++] ,str_len, buf);
        printf("Do you want to input another string? (Y/N): ");
        fflush(stdin);        
    }
    while(tolower((char)getchar()) == 'y');
    printf("%s\n", ps[str_count-1]);   //string output success
    outp_str_len = strnlen_s(ps[str_count - 1], sizeof(ps[str_count - 1]));//some errors!! sizeof() function
    if(outp_str_len == 0)
    {
        printf("strnlen() error!!!\n");
        return 4;
    }
    printf("outp_str_len = %d\n", outp_str_len); //length of string wrong
    //printf("sizeof(char*) = %zd\n", sizeof(char*));

    return 0;
        //这个程序可以输入100个字符以内的任意个数的字符串,我想用它给输入的字符串进行长度排序,程序没写完,在检查字符串长度时出错了。
        //我觉得是sizeof()的问题。。。。
}

搜索更多相关主题的帖子: color 
2015-03-31 11:56
_Dennis_h
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2015-3-6
收藏
得分:0 
回复 楼主 _Dennis_h
图片附件: 游客没有浏览图片的权限,请 登录注册

输出图片
2015-03-31 12:00
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
粗看了一下,'0' 应该是 '\0' 等不提了

outp_str_len = strnlen_s(ps[str_count - 1], sizeof(ps[str_count - 1]));
其中 ps 是 char** 类型,因此其就等同于
outp_str_len = strnlen_s( ps[str_count-1], sizeof(char*) );
你自己想想为什么值最大只到8
2015-03-31 15:09
_Dennis_h
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2015-3-6
收藏
得分:0 
以下是引用rjsp在2015-3-31 15:09:45的发言:

粗看了一下,'0' 应该是 '\0' 等不提了

outp_str_len = strnlen_s(ps[str_count - 1], sizeof(ps[str_count - 1]));
其中 ps 是 char** 类型,因此其就等同于
outp_str_len = strnlen_s( ps[str_count-1], sizeof(char*) );
你自己想想为什么值最大只到8

程序代码:
#include <stdio.h>
#include <string.h>

int main(void)
{
    char board[][10] = {
                       {"123"},
                       {"4561"},
                       {"123456789"}
                      };
    //printf("board[0][0] = %c\n", board[0][0]);
    //printf("board[0]    = %s\n", board[0]);
    //printf("*board      = %s\n", *board);

    printf("lenth board[2] = %d\n", strnlen_s(board[2], sizeof(board[2])));
//这里的board 为char**型,board[ ]为char*型,我在这输出board[2]的字符串长度,这个是正确的。
//就算改成strnlen_s(board[2], sizeof(char*)也能正确输出。
//我有一个疑惑!这个程序定义的是二维数组,board类型为char**型,而我的那个字符串排序程序定义的是一个char**型指针,这有什么区别?
//我取board数组的 第i个 子数组 board[i], 这等价于指针运算 *(board + i),这个等价是否有前提,就是首先必须定义一个二维数组。
//如果我直接定义char**指针,我逆向思维(假设上述前提非必要),char**类型就是一个char的二维数组,
//那我字符串排序程序里的strnlen_s(ps[str_count - 1], sizeof(ps[str_count - 1]))就应该没有错误吧。
//我的字符串排序程序没有输出结果希望的结果,所以上述假设(只能定义数组,将数组视为指针,不能定义指针,将指针视为数组)为必要条件?
    return 0;
   
}

2015-03-31 16:44
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:20 
//这里的board 为char**型,board[ ]为char*型,我在这输出board[2]的字符串长度,这个是正确的。
--- 这里的board为char[4][10]类型,board[]为char[10]类型;输出当然正确了,因为 sizeof(board[2]) 等于 10 呗

//就算改成strnlen_s(board[2], sizeof(char*)也能正确输出。
--- 能正确输出 9 吗?除非你的编译器有bug

//我有一个疑惑!这个程序定义的是二维数组,board类型为char**型,而我的那个字符串排序程序定义的是一个char**型指针,这有什么区别?
--- board类型为char[4][10],不是char**,这就是你错误的根源,下同,数组是数组,指针是指针
2015-04-01 09:48
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
楼主知道sizeof是啥吗?了解过吗?百度一下很明白

总有那身价贱的人给作业贴回复完整的代码
2015-04-01 14:17
快速回复:关于sizeof( )函数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039275 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved