| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1566 人关注过本帖
标题:问个关于C的问题
只看楼主 加入收藏
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
结帖率:95.56%
收藏
已结贴  问题点数:20 回复次数:29 
问个关于C的问题
每次用C写完程式时~程式需要去读取档案位置~和指定存档位置~
但是如果档案位置包含空白或有中文字或有特殊字元~
C每次都会异常~不知道有什么方法可以解决此问题?
原则上我都是使用VB6制作user介面~然后核心使用C去运行~
VB6中调用C是使用DOS Shell命令方式~
而DOS命令又会以空白符号来区分为各个不同的参数~
以致于到C时解出来的参数已经不是原本VB6所带入的参数~
加上单字元和双字元的问题~不知道有没有高手可以解决~
目前暂时不考虑使用CString去处理~
搜索更多相关主题的帖子: 档案 
2013-03-08 10:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
用标识字符区分参数,接口约定要你自己设计的。

授人以渔,不授人以鱼。
2013-03-08 10:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
文件路径和文件名允许包含空格,是Windows使用长文件名格式之后的事,原始的DOS是用8.3格式的,即文件名部分最大8个字符且不含空格,扩展名最大3个字符,长文件名超越了这些限制,因此出现你所说的问题,这就是学过旧知识造成无法处理新现象的问题。

要区分命令行的各个参数项item,由于空格已不能区分(早期DOS确实用空格来区分),所以必须另外约定区分符号。在C中,读入的命令行是一个字符串,你的责任是把这个字符串分解为正确的参数序列,可使用长文件名体系不允许的字符做分隔符,那些字符是双引号、正反斜线、问号、尖括号、星号、冒号、竖线等。

授人以渔,不授人以鱼。
2013-03-08 10:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
给程序传入命令行参数,可以使用如下的形式:
test.exe "a1 2.txt"
用一对""号来括住一项完整的参数,不用空格。这种写法,Windows会按""对来处理参数,同样,你在C中获得的参数数组也是这样。

授人以渔,不授人以鱼。
2013-03-08 10:46
party620
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:696
专家分:2521
注 册:2013-1-31
收藏
得分:7 
为了学习
2013-03-08 10:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
对与DOS兼容的Windows来说,上面所说的那些不能作为文件名的符号,有些是保留专用用途的,比如尖括号,是用于流输入输出的,问号和星号,是文件名的通配符,竖线是管道符号,双引号是新增的,正是用于区别参数。但是,不同的系统有不同的约定和规矩,我不担保上面所说的做法能移植到别的系统,但是原理是一样的。

至于宽字符,本来不成问题,默认的ANSI编码,就是按单字节处理所有字符的,不用管那是不是扩展码,除非你有必要识别它们。

[ 本帖最后由 TonyDeng 于 2013-3-8 11:37 编辑 ]

授人以渔,不授人以鱼。
2013-03-08 10:59
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
那如果是Shell(XXX\test.exe " a1 2.txt",vb???)
这样main()接口处接收到的参数不就又变回来了?

还是要变这样?
那如果是Shell(XXX\test.exe "\" a1 2.txt"\",vb???)
VB和C的语法有时会搞混...

那程式若是改成双字节,能支持中文字时,是否就表示所有字节都是一次读取2bytes...

双引号、正反斜线、问号、尖括号、星号、冒号、竖线等

目前是这样搞没错,只是公司边程人员只占一小部分,即使我知道这些限制,
但是仍有9成以上的工作人员不知道,每​​次发生问题都要跑来问,久而久之传开来,
就变成我写的代码都有问题,实在很头痛.

P.S 可恨的是大多数人贪图方便,每次都把程式放在桌面运行,
微软也够机车,桌面路径就带了两个空白,每次都要讲,
讲到我都觉得烦了,所以想从代码上​​去解决这限制.

宽字符是因为中国人都爱用中文当资料夹名称,偏偏中文又是宽字符的.
C把宽字符当单字符来读取,马上就乱码了,只是好奇Unicode和ANSII Code编写实有何差别?

不要投我
2013-03-08 15:53
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:7 
以下是引用TonyDeng在2013-3-8 10:59:27的发言:

对与DOS兼容的Windows来说,上面所说的那些不能作为文件名的符号,有些是保留专用用途的,比如尖括号,是用于流输入输出的,问号和星号,是文件名的通配符,竖线是管道符号,双引号是新增的,正是用于区别参数。但是,不同的系统有不同的约定和规矩,我不担保上面所说的做法能移植到别的系统,但是原理是一样的。

至于宽字符,本来不成问题,默认的ANSI编码,就是按单字节处理所有字符的,不用管那是不是扩展码,除非你有必要识别它们。
有道理,我还得多学习

Maybe
2013-03-08 19:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
用C写Windows下的程序,直接调用API创建进程就是了,不必用Shell。

授人以渔,不授人以鱼。
2013-03-09 11:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 7楼 yz1025
我不大明白你所说的中文出错是什么现象,要达到什么效果,最好说清楚一些。

授人以渔,不授人以鱼。
2013-03-09 12:03
快速回复:问个关于C的问题
数据加载中...
 
   



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

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