求大佬解答我想在主函数里使用调用函数里的变量,这变量是中文,
c4droid吧
全部回复
仅看楼主
level 8
求大佬解答
我想在主函数里使用调用函数里的变量,这变量是中文,主要想通过形参传递,但中文要用数组或指针,再传递的话,我糊涂了[泪]。中文如a[]="我爱中华"或*a="我爱中华",但我说到这中文是变量,是不是不要考虑数组了?但我又不会指针。我看书上说什么可以通过执行调用函数来改变实参指针变量所指向的值,但这变量是调用函数里面的,跟书上直接在主函数里面的数不一样。至于用调用函数直接输出保存在,,额,输着输着又想到这方法,我再试看看!但我的初衷是调用这函数返回很多数,这其中有汉字,要是能直接返回3个数组就好了。
2018年05月08日 09点05分 1
level 14
你描述的有点乱,不如你先上一部分代码,然后看看有没有人帮你改。
2018年05月08日 14点05分 4
大佬,代码我发贴子里了,帮我看下呗
2018年05月08日 23点05分
level 1
你的描述确实很乱,有必要提供下你的代码。
目前来看,你的理解也存在问题。
你所说的“中文字变量”("我爱中华")只不过是一串字符量;只要空间没计算错(空间需要根据编码计算),处理任何字符串的思路的都是一样的。
在 C 下,字符串的实质是一列 char 数组(正常情况下,以 \0 结尾)。于是,你要传递这串字,只要根据情况操作数组/指针即可。
你现在需要学习的大概是,字符数组(字符串)的操作。
2018年05月08日 14点05分 5
代码我发贴子里了
2018年05月08日 23点05分
大佬麻烦您看下呗!拜托拜托!
2018年05月10日 01点05分
level 8
#include <stdio.h>
int main()
{
int E[9]={0};
int M[9]={0};
int X[1]={0};
char *N;
int C=9,i;
int O=1;
void SB(int C,int O,int M[9],int E[9],int X[1],char *SN);
SB(C,O, M,E,X,N);
for (i=0;i<9;i++)
printf("%d ",M[i]);
printf("\n");
for (i=0;i<9;i++)
printf("%d ",E[i]);
printf("\n");
for (i=0;i<1;i++)
printf("%d ",X[i]);
printf("\n");
printf("%s",N);
printf("\n");
return 0;
}
void SB(int C,int O,int M[9],int E[9],int X[1],char *SN)
{
int MA,MB,MC;
int MD,ME;
int MF,MG,MH;
int EA,EB,EC;
int ED,EE;
int EF,EG,EH;
int ML;int EL;
int WO=0;
char *SK;
if (C==1)
{
switch (O)
{
case 0:printf("");break;
case 1:*SK="虾米",WO=1, ML=2,MA=50,MB=-45;break;
case 2:*SK="光",WO=1, ML=1, MA=80,MB=-50;break;
case 3:*SK="灵",WO=1, ML=99, MH=100,MB=-60;break;
}
}
else if (C==2)
{
switch (O)
{
case 0:printf("");break;
case 1:*SK="金",WO=1,ML=99, MH=120,MB=-65;break;
case 2:*SK="之移动哦",WO=1,ML=3, MD=40,MB=-75;break;
}
}
else if (C==3)
{
switch (O)
{
case 0:printf("");break;
case 1:*SK="行我够",WO=1,ML=3, MA=-100, MD=40,ME=40; break;
case 2:*SK="你一直问手",WO=1,ML=1, MA=-100,MB=150;break;
}
}
else if (C==4)
{
switch (O)
{
case 0:printf("");break;
}
}
else if (C==5)
{
switch (O)
{
case 0:printf("");break;
case 1: break;
case 2: break;
case 3:break;
}
}
else if (C==6)
{
switch (O)
{
case 0:printf("");break;
case 1:break;
}
}
else if (C==7)
{
switch (O)
{
case 0:printf("");break;
case 1:break;
}
}
else if (C==8)
{
switch (O)
{
case 0:printf("");break;
case 1:break;
}
}
else if (C==9)
{
switch (O)
{
case 0:printf("");break;
case 1: break;
}
}
else if (C==10)
{
switch (O)
{
case 0:printf("");break;
case 1: break;
}
}
else if (C==11)
{
switch (O)
{
case 0:printf("");break;
case 1:break;
}
}
2018年05月08日 23点05分 6
fangshan
2018年05月08日 23点05分
level 8
else if (C==12)
{
switch (O)
{
case 0:printf("");break;
case 1:break;
}
}
M[0]=MA,M[1]=MB,M[2]=MC;
M[3]=MD,M[4]=ME;
M[5]=MF,M[6]=MG,M[7]=MH;
M[8]=ML;
E[0]=EA,E[1]=EB,E[2]=EC;
E[3]=ED,E[4]=EE;
E[5]=EF,E[6]=EG,E[7]=EH;
E[8]=EL;
X[0]=WO;
}
2018年05月08日 23点05分 7
level 8
额,没看懂,但
在c4a里中文汉字用utf8编码,一个中文字符占用3字节(24位);字符变量组(char*)可以保存中文字符,既然是字符串操作那就好好利用string.h
希望对你有帮助
2018年05月09日 12点05分 9
额,我不会描述,但群里发了代码了
2018年05月09日 13点05分
@螃蟹钳Epi😘 顺便提醒一句:赋值语句间要用";"不是"," 例如:E[3]=ED,E[4]=EE; 改为:E[3]=ED;E[4]=EE;
2018年05月09日 14点05分
😓😓
2018年05月09日 23点05分
@螃蟹钳Epi😘 搞懂了,把你的源代码中: 把char *N改成char N[100]防止把在后面定义的变量覆盖。 把SB中?*KN="..."改成sprintf(SN,"%s","...")
2018年05月10日 01点05分
level 8
2018年05月09日 23点05分 10
啊咧,抱歉,我错了,学到了
2018年05月09日 23点05分
level 8
//大佬们!为什么switch使用时在里面给字符数组赋值identifierexpected?还有字符数组做形参是不是不可以虚实结合?我不想用if,那样感觉代码太丑了,我想用switch。
else if (C==2)
{
switch (O)
{
case 0:printf("");break;
case 1:char SN[25]="金",
WO=1,ML=99, MH=120,MB=-65;break;
2018年05月10日 01点05分 12
拜托拜托[太开心][太开心]
2018年05月10日 01点05分
回复 爱签到的萌新😘 :"金"的类型可以看做char[4]所以←_←乖乖用sprintf()吧
2018年05月10日 02点05分
@color371 可是我是调用,不是输出呀[惊哭]
2018年05月10日 03点05分
level 8
@一棵草斩星辰- @不知者来此 大佬帮帮忙,看下呗!网上真没找到
2018年05月10日 09点05分 13
level 1
我直白地说吧,语言可能比较犀利,楼主你先冷静一下,请见谅。
从你已经放出来的代码和前面的对话来看,你的风格和思路与多数人不一样,你对概念的理解似乎也很奇怪。
1. 你这个程序里遍地是不初始化就使用或者声明了却不使用的变量。你的程序不可避免指针(你也知道不能滥用全局变量),但你对指针的理解明显存在问题。你还进行了类型不匹配的赋值这么危险的操作。
具体说来,viodSB 函数是重灾区,GCC 打出了几十行 warning,几乎都在这个函数里,几乎都是我上面提到的这几种情况。
举个例子,你声明了一个指针量,下一步应该是动态或者静态分配一些匹配的空间并把地址存到指针里,但你没有初始化,又接着把一个地址赋给了指针指向的(不存在的)空间的里。你可能没有意识到,你第1版代码中给 SK 赋值的语句都是这种问题;必然出错。
2. 你多次提到“虚实结合”,可是说实话,我头一次听说这个词,吓得回去翻书也没查着这种叫法;我根本不明白你想表达什么。
3. 你反复纠结“输出”和“调用”。但是你在纠结什么,何况 C 下根本没有“输出”这个概念,所谓的“输出”不过是写入的一种。read/scan/get 和 write/print/put 的操作主体是文件/变量,call 和 return 的主体是函数。
4. 再提一个你写的很奇怪的语句 printf("");
即,向 stdout 里写入一个什么都没有的串,这种操作毫无意义。如果你想印屏点东西,写上,不要空着。
5. 最后谈书写习惯吧。楼主你的命名风格与多数人不一样,看着很魔幻。我们一般命名函数和变量采用驼峰式或划线式,命名常量尤其是宏定义用全大写。你这近200行的代码里有一大堆看上去像冗余的东西,让人费解。这些都显著增加了阅读难度,如果你希望别人愿意读你的代码,用点有意义的名称,加点注释吧。
2018年05月11日 17点05分 15
谢谢大佬为我解答!首先,我指针不会用就乱用,这是个问题。第二点,我觉得那些变量不需要初始化,因为在下面的switch语句中对其进行赋值了,至于那些没使用的,我只是复制的时候,把代码删减了,还有大写问题,书上说常量是大写,但我个人觉得大写字母好看些[哈哈],喜欢用。
2018年05月11日 22点05分
嗯,再次感谢您看我代码,没加注释是我的错。我发贴子主要想请大佬帮我解决下中文汉字保存在字符数组中,通过改变形参以使实参改变,从而达到在主函数中调用函数时,获取调用函数中的中文汉字,但是汉字保存有两种,一种是字符串数组,还有一种是指针,我指针不会用,数组呢
2018年05月11日 23点05分
数组在switch,case中,赋值出现了identifier expected错误,网上说加{}就好了,但是没用,它的确不报错了,但却没输出中文,针对这问题,已经有位大佬帮我了,他说可以用sprintf格式化输出字符串,嗯,这就解决了我的问题
2018年05月11日 23点05分
level 1
好吧,看来你确实不明白指针。那我就具体点一下。
在你第1版代码中,有这样的语句:
char *SK; // 创建一个 char* 型指针 SK
*SK="金"; // 创建一个字符串数组,里面存着 "金",再把它的地址赋给指针 SK 指向的存储空间
这是非法操作。(编译器应该会报 warning 呀)一方面,你在创建 SK 后没有初始化它,此时 SK 指向未知的空间(可认为是不可操作的不存在的空间),硬向里面写数据会导致程序崩溃。另一方面,*SK 是 char 型,而字串 "金" 是 char* 型,第二句话是类型不匹配的赋值,即使顺利执行,结果也是不可预料的。
在你第2版代码(12楼)中,有这样的语句:
char SN[25]="金"; // 创建字符数组 SN[25],并以 literal 方式赋初值
这是重复声明(会报 error),因为在形参表中已经声明了 char *SN。
其实想要赋值很简单。可以用 sprintf 之类的函数向字符数组写串,也可以直接赋地址让指针 SN 指向一个字串。
下面的这段代码提供演示。
#include <stdio.h>
/*
下面了例子演示了使主函数中的字符数组 c2[10] 存储期望的内容,
我们仅推荐 expfun2 实现
*/
char *expfun1(int key)
{//仅作演示,不建议这种实现!
char *str;
switch (key)
{
case 1: str = "金";break;
case 2: str = "银";break;
default:str = "火";
}
return str;
}
// 在形参表中,char str[] 等价于 char *str,我们通常以这种形式提醒编程者要传入一维数组的指针
int expfun2(int key,char str[])
{
int retv;
char *nst;
switch (key)
{
case 1:
nst = "金";
break;
case 2:
nst = "银";
break;
default:
nst = "火";
}
retv= sprintf(str,"%s",nst);
return retv;
}
int main()
{
char *pS=NULL, c2[10]="nothing";
pS=expfun1(1); //仅作演示,不建议这种实现!
printf("%s\t%lu\n", pS, sizeof pS); //取决于编译器,你可能会看到奇怪的结果
expfun2(2, c2);
printf("%s\t%lu\n", c2, sizeof c2);
return 0;
}
我仍想再谈谈命名习惯的问题。几十年来大小写习惯已经约定俗成了,可以说是不成文的规定;甚至许多编辑器见了全大写的名称直接按宏定义着色。此外,当你有上千行代码需要管理时,你会开始感到纯大写的困惑和混缩的必要性。所以,出于方便你和他人的考虑,如果你非常喜欢全大写的样子,不妨在变量、函数等不是常量的对象的名字前缀个小写字母,比如 iMK, fCS, cA, sN。
2018年05月14日 14点05分 16
1