linux终端c语言编译器源代码打印字符乱码,c源代码,运行结果,语言环境在下图。

#include&&stdio.h&
#include&&math.h&
int&main()
int&sum_prime(int&r[]);
int&prime(int&n);
int&i,r[10],
sum=sum_prime(r);
for(i=0;i&10;i++)
printf(&%6d&,r[i]);
printf(&\nsum=%d\n&,sum);
int&sum_prime(int&r[]){
int&i,j=499,sum=0;
int&prime(int&n);
for(i=0;i&10;i++){
if(prime(j)){
sum=sum+j;
return(sum);
int&prime(int&n){
k=(int)sqrt((double)n);
for&(i=2;i&=k;i++){
if(n%i==0)&return(0);
if(i&=k+1)&return(1);
回复讨论(解决方案)
你的int&prime(int&n) 函数是做拷贝后的值交换的,本身的值没有发生改变的!
int&prime(int&*n);//换成传指针吧,操作地址,才能达到实际改变值的目的!】
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo&C或Borland&C用Turbo&Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
但我又不得不承认:
&有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物;
&而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。
而我本人属前者。
这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、 理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!
“学习用汇编语言写程序”
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
不要写连自己也预测不了结果的代码!
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
十字链表交换任意两个节点C源代码(C指针应用终极挑战) http://download.csdn.net/detail/zhao4zhong1/5532495
#include&&stdio.h&
#include&&math.h&
int&sum_prime(int&r[]);
int&prime(int&n);
int&main()
int&i,r[10]&=&{0},&//r数组初始化为0
sum=sum_prime(r);
for(i=0;i&10;i++)
printf(&%6d&,r[i]);
printf(&\nsum=%d\n&,sum);
int&sum_prime(int&r[])
int&i,j=499,sum=0;
int&prime(int&n);
for(i=0;i&10;i++)
if(prime(j))&//只有prime返回1,r[i]才赋值,
&&&&&&&&&&&&&&&&//上面r定义时已初始化,现不会出现乱码,prime()返回0时r[i]就是初始化的0
sum=sum+j;
return(sum);
int&prime(int&n)
k=(int)sqrt((double)n);
for&(i=2;i&=k;i++)
if(n%i==0)&return(0);
if(i&=k+1)&return(1);&//写在for循环外面,否则执行不到
看楼上已经解决喽,贴个供参考的代码吧!判断素数
&&2&int&is_prime(unsigned&long&n)
&&4&&&&&if(n&&=&1)
&&5&&&&&&&&&return&0;
&&6&&&&&if(n&==&2)
&&7&&&&&&&&&return&1;
&&9&&&&&int&i;
&10&&&&&for(i&=&2;&i&*&i&&&n;&++i){
&11&&&&&&&&&if(n&%&i&==&0){
&12&&&&&&&&&&&&&return&0;
&13&&&&&&&&&}
&15&&&&&return&1;
c函数参数传递本质是by&value
当prime函数的返回值为0时,在函数sum_prime的r[i]未赋值,所以在main函数中打印会出现乱码。
看你这样风格,提点建议:
1. int&sum_prime(int&r[]);
int&prime(int&n);
都放在main函数之前全局声明
2.&int型函数需要有返回值C语言中函数体内对外部字符指针赋值
发布者:lang1617 时间:08-03 阅读数:181
  今天同事问我一个C程序code.c,代码如下:&#include& &stdio.h&&int& test(char *b)&{&b = "123\0";&return 1;&}&int& main()&{&char a[10];&test(a);&printf("a[] = %s\n", a);&return 1;&}&同事的目的是给数组a赋值一个常量字符数组,但程序打印后显示乱码。旁边的同事以C语言的语义来解释这段代码出现该问题的原因,如给test()传递的参数是a的一个拷贝,test()内部不会改变a的值等等。同事的观点是对的,但这段代码确实值得我们仔细探讨下。
  C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
  读C++ Primer 之构造函数陷阱
  读C++ Primer 之智能指针
  读C++ Primer 之句柄类
  C++11 获取系统时间库函数 time since epoch
  C++11中正则表达式测试 &1.工作流程:&main()的栈中分配了数组a的空间,从高地址到低地址依次是a[9],a[8],a[7], &,a[1],a[0]。然后在更低的栈中分配了4个字节(假设地址占4个字节),存放的内容是数组a的地址,然后将其作为test()的实参。test()函数从main()的栈中把存放数组a的地址的内容改成&123\0&的地址,然后函数返回main(),打印出最后的结果。  2.出现异常的原因main()函数将数组a[10]的地址存放在main()的栈底,作为test()的实参。test()函数确实改变了存放在该栈底的4个字节的内容,并使其成功指向&123\0&,但main()程序在test(a)之后,并没有使用存放在栈底的结果,因此数组a[10]的内容保持其初始值不变,导致打印时出现乱码(也可能显示其它字符)。
  C语言中的函数,只要它有形参,则父函数在调用该子函数之前,必须在父函数的栈中保存调用子函数所需要的参数。子函数执行完成后的结果,要么通过寄存器返回,要么通过栈返回。父函数将字符指针赋给子函数,子函数将该字符指针指向正确的位置,有2种方式:1.子函数将执行的结果存放在寄存器中,父函数读取寄存器中的结果。举例如下:#include&stdio.h&char *test(void){char *tmp = "123akdsf\0";}int main(){char *addr = test();printf("addr = %s\n", addr);return 1;}2.子函数将最终结果存放在栈中,父函数调用子函数时,必须传递地址。举例如下:#include&stdio.h&void test(char *b){
  *b = '1';*(b + 1) = '2';*(b + 2) = '3';*(b + 3) = '\0';}int main(){char a[10];test(a);printf("a[] = %s\n", a);return 1;}
  此时test()已经通过引用栈上存放的数组a的地址,修改了main()栈中的a[10]的内容,故从test()返回后,已经得到了正确的结果。
  如果想知道上述例子的具体执行情况,只能看汇编代码。下面提供Ubuntu系统下shell中的对应指令:
  gcc code.c -O0 -o code(-O0的意思是不进行代码优化)
  objdump -d code(查看code的反汇编代码)
  上述例子的运行环境:Ubuntu 10.10Pentium(R)Dual-Core CPU E5400 @ 2.70GHzgcc version 4.4.5
  本文永久更新链接地址:
: 最近更新linux环境c语言编程!问题棘手!高手进!_百度知道
linux环境c语言编程!问题棘手!高手进!
&#47?10;//父进程执行代码
/int pid[3];return EXIT_SUCCESS.h&int i:atoi(argv[i+1]);i++) {
/&#47.sched_priority=(argv[i+1];s policy is %d&#92!如果答案满意;0)
{/for(i=0;printf(&quot!=NULL),getpriority(PRIO_PROCESS,
sleep(1),sched_getscheduler(pid[i]));&#47,getpid():#include&lt.h&gt,但是又不知道是什么问题导致;n&子进程执行代码
sleep(1);n&#include&lt./报告进程号和优先级
printf(&i&return EXIT_SUCCESS!=NULL);3;time,实验结果应该是优先数低的进程先执行;/for(i=0;%d\sys/i&n&i&//3:10);i++)printf(&&#47,demo[i]).h&gt,调度方法采用SCHED_OTHER;sys&#47?atoi(argv[i+1]);i&这样的语句有问题;#include&根据命令行的参数设置进程的优先级
setpriority(PRIO_PROCESS;i&lt,三个进程的优先级是10 0 0;);
exit(EXIT_SUCCESS);#include&lt:SCHED_OTHER;n&quot,pid[i]:atoi(argv[i+1])!=NULL);#include&lt,pid[i];/
else&#47。个人感觉都是demo[i]=(argv[i+1]==NULL);/;创建3个子进程
if((pid[i]=fork())&gt:10;stdlib:1;/3;for(i=0,0));demo.linux终端里就算运行时后面加上三个参数,&p[i]);存放进程号struct sched_param p[3];?atoi(argv[i+4])?10,char *argv[]){&#47,而且设置三个进程的调度算法那里也有类似的问题;3;i++)demo[i]=(argv[i+1]==NULL);父进程报告子进程调度策略for(i=0.h&gt源代码,比如输入;i++)printf(&
for(i=0,而且后面给进程设置优先级貌似也是这个问题,(argv[i+4];child %d priority=%d\;
&#47?atoi(argv[i+1]);My child %d '/int main(int argc,j.h&gt,完全按照你输入的顺序;&#47,然后5 然后10 但是现在结果是5 1 10 也就是你怎么输入的它怎么输出;/psched 5 1 10(假定编译后形成的可执行文件名是psched);根据命令行参数设置进程的调度策略
sched_setscheduler(pid[i]。本人百思不得其解,故跪求解释:\从命令行参数中取进程优先数存放在调度参数结构中
p[i];resource!2;3,(argv[i+1].终端里不加任何参数运行时demo(这段程序是为测试参数输入是否正确额外加上去的)本来应该是三个10 但是linux下运行得到的却是10 0 0;调度参数结构int demo[3];
} } /}现有如下问题;i++)
&#47,期待高手解答,我可以再追加20分;
&#47,期待的输出结果应是优先级为1的先执行
提问者采纳
因此第一个子进程执行了printf优先级再高的进程sleep了也抢不过优先级低的活动进程因此最好保持3个子进程同时活动else/ 【第二个问题】我的理解是第一个子进程wakeup的瞬间;for(--i,其他的子进程还是sleep【第一个问题】argv[i]越界了;子进程执行代码{
sleep(1);argc,0));3;为了父进程顺利启动3个子进程;//i;i++)
demo[i-1]=atoi(argv[i]),getpriority(PRIO_PROCESS;报告进程号和优先级
printf(&n&i++);保持活动一段时间
exit(EXIT_SUCCESS);/i&&#47,不能保证都是null,sleep还是留着吧
for(i=1;&#47,改成这样for(i=1;child %d priority=%d\i&//++i)
demo[i]=10;;return EXIT_SUCCESS;
&#47,getpid()
提问者评价
虽然第二个问题还是不行,但是就你最仔细了。
参考资料:
没做过实验,自己琢磨的,错了可不负责任
其他类似问题
为您推荐:
c语言编程的相关知识
其他4条回答
这种专业性较强的问题你可以到
编程中国论坛去求助
那里的全是高手.
1.demo[i]=(argv[i+1]==NULL)?10:atoi(argv[i+1]);这句话确实有问题,因为i+1可能导致数组访问越界,改为demo[i]=(i+1&=argc)?10:atoi(argv[i+1]);即可2.我在LINUX下执行过多次(内核版本2.6.32)每次结果都不一样,你所提到的每次都一样应该是,程序中输出次数太小导致,看不出规律。我对此的解释是当前LINUX进程调度器的调度方式都只能用尽力而为来形容,它并不能保证进程严格的按照优先级来调度执行。另外关于新版本的LINUX内核调度器的情况,可以参照
这份诱人。。我没分下载书籍看了。郁闷。。
建议去学习LINUX内核,再回来学习Linux编程吧~!如果不对LINUX内核了解,根本就无法去学习
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁c语言运行结果乱码怎么解决?_百度知道
c语言运行结果乱码怎么解决?
&m),m,&n);min)
min=m;,max=%d\nmin=%d&quot:&
printf(&=n;/stdio,n;%d&
max=min:&i&i++);
scanf(&;max)
max=m;;找出n个数中最大的数和最小的数;main(){
int max,i);
if(m&%d &quot,max,i;输入第%d个数,并将它们的值输出出来#include&输入n;
printf(&.h&gt&#47,min);
提问者采纳
printf(&%d&.h&,max)
max=m,n:&
scanf(&quot, &m),min);nmin=%d&min)
max=min=m:#include&
scanf(&,i;
for(i=1;);
else if(m& i&stdio:&
printf(&;main(){
int max,&n);max=%d\=n,m;输入第%d个数;输入n;
else if(m&%d& i++)
printf(&quot, i)发你的代码看看max与min没有初始化还有就是for语句后多了一个分号修改后的代码如下
怎么初始化?输入值的范围不确定
已给出修改后的代码,你看看
这是我按照你的修改的,还是乱码,你看有没有问题。不过我新建了一个文档把你的粘进去就好了,我怀疑是不是编码方式的问题
你的scanf里面多了一个空格
第二个scanf
修改后还是乱码
你用的是什么工具?
codeblocks
那应该没问题呀,你重新编译过没,代码截图如下:&测试结果如下:
提问者评价
来自团队:
其他类似问题
为您推荐:
其他4条回答
是不是输出格式不对,要不就是有变量没有初始化min没有初始化
你程序中max和min都没有初始值,应该给max赋一个比所有输入的数都小的值,给min赋一个背所有输入的数都大值
可是输入值的范围没有给定啊,怎么符初始值
那就用一个标记变量,flag=0,如果flag=0说明输入的是第一个数,那就max=min=n(n是输入的整数),flag=1。如果flag=1就进行比较后,改变max,min的值。
应该是内存泄露导致的
是不是打印字符串时字符串没有结束标识?
c语言的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁今天看啥 热点:
1、Source Insight 3.50.63 不能显示编码为UTF8的源文件中的中文字符。ANSI编码的文件中的中文字符能正常显示。(最新的3.50.64版本也有同样问题)
2、Windows下无论源代码文件是UTF8还是ANSI,对编译结果无影响。
3、Linux下源代码文件是UTF8的中文显示正常,ANSI的中文乱码。
正文:发现问题的经过)
今天偶然发现,在SI中,中文字符串显示为乱码。
650) this.width=650;" style="border-bottom: 0 border-left: 0
border-top: 0 border-right: 0px" title="image" border="0" alt="image" src="/uploads/allimg/Q.png" "575" height="61" />
但如果用notepad打开该文件,则不是乱码。从notepad打开的界面中复制到SI中,也不是乱码。
据此,可以推测,该文件保存为某种编码,使得SI不能正确显示。
用UE打开该文件,另存一个为ANSI格式的文件KtvMainScreen1.cpp:
650) this.width=650;" style="border-bottom: 0 border-left: 0
border-top: 0 border-right: 0px" title="image" border="0" alt="image" src="/uploads/allimg/Q22045c-1.png" "371" height="271" />
然后再在SI中打开,中文显示正常了。
然后用BC打开,发现:原来的SI中乱码的文件是UTF-8格式的。
650) this.width=650;" style="border-bottom: 0 border-left: 0
border-top: 0 border-right: 0px" title="image" border="0" alt="image" src="/uploads/allimg/Q220M10-2.png" "1279" height="224" />
把左边选择为ANSI才能显示正常:
650) this.width=650;" style="border-bottom: 0 border-left: 0
border-top: 0 border-right: 0px" title="image" border="0" alt="image" src="/uploads/allimg/Q.png" "1280" height="220" />
能否用另存的文件来代替原来的文件进行编译呢?那样会不会在软件中出现乱码?
后来,用下面代码测试中文显示,有一种写法中文显示正常。
#include &QApplication&
#include &QPushButton&
#include &QString&
int main(int argc, char *argv[])
    QApplication app(argc, argv);
    //QPushButton hello(QObject::trUtf8(&世界您好!&)); //Win7下运行时中文乱码
    //QPushButton hello(QObject::tr(&世界您好!&));//Win7下运行时中文乱码
    QPushButton hello(QString::fromLocal8Bit(&世界您好!&));//Win7下中文显示正常
    hello.resize(100, 30);
    hello.show();
    return app.exec();
该文件为ANSI存储。另存为UTF8版本,编译后,中文显示仍然正常。
但二进制比较该源文件时,可以发现UTF8比ANSI每个汉字多一个字节。
650) this.width=650;" style="border-bottom: 0 border-left: 0
border-top: 0 border-right: 0px" title="image" border="0" alt="image" src="/uploads/allimg/Q22050G-4.png" "1284" height="804" />
由此可知,Windows上,源代码文件为UTF8还是ANSI编码,编译后都不会有乱码。
然后在Linux上也把两种文件都编译一次,发现UTF8的文件,中文正常;ANSI的文件,中文乱码。
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&
C语言最近更新}

我要回帖

更多关于 魂斗罗c语言源代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信