帖一段C的代码,求解

gslqy 2010-09-19 01:38:36

#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <assert.h>

int SplitString(const char* str_dest);

int main(int argc, char** argv)
{
char *sz_str = (char*)malloc(100);

memset(sz_str, 0, 100);

while(printf("Wait input:\n"), scanf("%s", sz_str))
{
printf("Result:\n");
SplitString(sz_str);
}
}

int SplitString(const char* str_dest)
{
char sz_temp[100];
char sz_short[10][100];
int n_index = 0;
int n_szCount = strlen(str_dest);

memset(sz_temp, 0, 100);
memset(sz_short, 0, 100 * 10);
assert(n_szCount <= 100);
strcpy(sz_temp, str_dest);

for (int i = 0; i <= 99; i++)
{
for (int n = 0; n <= 100; n++)
{
if (',' != sz_temp[i])
{
sz_short[n_index][n] = sz_temp[i];
i++;
}
else
{
assert( n + 1 <= 100);
sz_short[n_index][n + 1] = '\0';
n_index++;
break;
}
}

}

for (int i = 0; i <= 9; i++)
{
printf("\t%s\n", sz_short[i]);
}
return 0;
}


这段代码作用为: 输入 "abc,def",输出
abc
def
就是去掉逗号,拆分为子字串。
不过现在问题是输出结果
abc
def
?
后面出现一位乱码。 这点很奇怪,因为我已经用memset清空内存了,求解
...全文
102 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gameslq 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gslqy 的回复:]
出错的地方在于
for (int n = 0; n <= 100; n++) // 这里n大于数组下标
但是
下面的操作(由于都是很短的字符,不可能对sz[100]赋值)理论上不会出现索引越界,
为什么会出现乱码呢
[/Quote]
如果只是输入abc,def的话不会出现数据越界,程序明显有以下错误:
1.malloc 后,没有free
2.for (int i = 0; i <= 9; i++) //中的9 改为n_index
3.sz_short[n_index][n+1] = '\0'; //中的 sz_short[n_index][n+1] 改为 sz_short[n_index][n]
把这个句去掉 memset(sz_short, 0, 100 * 10); 就会看到效果了
码侬 2010-09-19
  • 打赏
  • 举报
回复
最后一个?应该是回车符号吧
gslqy 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xxd_qd 的回复:]

C/C++ code

for (int i = 0; i <= 99; i++)
{
for (int n = 0; n <= 100; n++)
{
if (',' != sz_temp[i])
{
sz_short[n_index][n] = sz_temp[i……
[/Quote]

感谢
xxd_qd 2010-09-19
  • 打赏
  • 举报
回复

for (int i = 0; i <= 99; i++)
{
for (int n = 0; n <= 100; n++)
{
if (',' != sz_temp[i])
{
sz_short[n_index][n] = sz_temp[i];
i++;
}
else
{
assert( n + 1 <= 100);
sz_short[n_index][n + 1] = '\0';
n_index++;
break;
}
}

}

输入"abc,def",i = 3的时候运行到break,然后i++变成4,再进入循环for (int n = 0; n <= 100; n++),此后(',' != sz_temp[i])一直成立,于是最终循环到n=100,此时i=104(早已越界),n_index=1,赋值代码sz_short[n_index][n] = sz_temp[i];实际上是在给sz_short[2][0](sz_short[1][100]就是sz_short[2][0])赋一个越界指针所指向的内存值,乱码已经是最好结果了。
gslqy 2010-09-19
  • 打赏
  • 举报
回复
出错的地方在于
for (int n = 0; n <= 100; n++) // 这里n大于数组下标
但是
下面的操作(由于都是很短的字符,不可能对sz[100]赋值)理论上不会出现索引越界,
为什么会出现乱码呢
dh_fa 2010-09-19
  • 打赏
  • 举报
回复

//输出部分也应该改一下
for (int i = 0; i < split_count; i++)
{
printf("%s\n", split_flag[i]);
}
dh_fa 2010-09-19
  • 打赏
  • 举报
回复

int SplitString(const char* str_dest)
{
char sz_temp[100];
char *split_flag[100] = {0};//记录拆分后每个子串的开头地址
split_flag[0] = sz_temp;
int split_count = 1;//记录拆分后子串的个数
int n_szCount = strlen(str_dest);

memset(sz_temp, 0, 100);
memset(sz_short, 0, 100 * 10);
assert(n_szCount <= 100);
strcpy(sz_temp, str_dest);

for (int i = 0; i <= n_szCount && sz_temp[i] != '\0'; i++)
{
if (sz_temp[i] == ',')
{
sz_temp[i] = '\0';
split_flag[split_count++] = (&sz_temp[i]) + 1;
}
}

for (int i = 0; i <= 9; i++)
{
printf("\t%s\n", sz_short[i]);
}
return 0;
}




你试一下这个,没有编译过,这里没有编译器…………
用户 昵称 2010-09-19
  • 打赏
  • 举报
回复
比较短,vc下调试看一下吧。
gslqy 2010-09-19
  • 打赏
  • 举报
回复
期待牛头人来解答, 出错的地方我已经找到了。不过很抱歉~不是上面两位说的原因
地方找到了,但是原因还不明白
Simao 2010-09-19
  • 打赏
  • 举报
回复
因为你写的9比 n_index 大,而此时sz_short这个值只是字符的初始值被你格式化了,出现?表示没有东西可显示。
gslqy 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hztj2005 的回复:]
for (int i = 0; i <= n_index ; i++) //i <= 9
{
printf("\t%s\n", sz_short[i]);
}
[/Quote]

-1。。。
我也知道那样输入是不会显示乱码,因为根本没有print。 我现在只是对那个乱码的来源感兴趣,对程序功能不感兴趣(这是帮别人做的习题)
hztj2005 2010-09-19
  • 打赏
  • 举报
回复


for (int i = 0; i <= n_index ; i++) //i <= 9
{
printf("\t%s\n", sz_short[i]);
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧