C语言的putchar为什么会倒序输出字符串

图片说明

这个程序,当我输入123456回车之后,为什么会倒序输出654321
进入try,输入一个字符串123456,然后getchar取1赋值给c,再次执行try,取2赋值给c,依次向下,当取到回车的时候if不成立,执行putchar,这个时候c应该是等于6的才对呀,为什么c会变成654321

c

5个回答

这个是递归的问题,从你的实现逻辑来看,如果当前不是换行就继续递归处理下一个字符。最后碰到换行字符,就依次地退出,出现654321的输出了。

try()函数是一个递归,取到回车后,首先putchar打印6,try()函数会返回上一层调用打印5,接着依次打印4321

看清楚,你的putchar也执行了6次

try()函数里在putchar()之前以调用了try(),这就是递归调用,根据函数栈后进选出的原理,6是最后的,先输出

try()是递归函数

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
菜鸟求解c语言中putchar和getchar的细节。
``` # include <stdio.h> int main() { int trans(char); char c; printf("输入一串字符串进行翻译:\n"); c = getchar(); while(c != '\n') { c = trans(c); printf("%d", c); getchar(); } putchar('\n'); return 0; } trans(char ch) { if(ch >= 65 && ch <= 86 || ch >= 97 && ch <= 118) ch += 4; if(ch >= 87 && ch <= 90 || ch >= 119 && ch <= 122) ch -= 22; return ch; } ``` 这里我运行以后会出现这样的情况: ![图片说明](https://img-ask.csdn.net/upload/201508/07/1438914665_358848.jpg) **就是我只输入了4个字符,结果却输出了5个,这是怎么回事啊??** 菜鸟正在学习,跪求大神解答!
C语言,字符串匹配问题
题目是:输入两个字符串,输出字符串1中与字符串2最先匹配的内容,字符串2中可包含?,?可代表任何字符。已知字符串2不会全为?。 输入输出格式:输入:abcdefabcdeg,a?c??f 输出:abcdef 下述代码可运行出题目中的例子,但测评显示答案错误,是哪里错了,还望大神们指教! ``` #include <stdio.h> int main() { char str1[129],str2[129],*p1,*p2,c,str[129],*p3; p1=str1; p3=str; while(1) { c=getchar(); if(c==',') { (*p1)='\0'; break; } (*p1)=c; p1++; } gets(str2); for(p1=str1,p2=str2;((*p1)!='\0')&&((*p2)!='\0');p1++) { if(((*p1)==(*p2))||((*p2)=='?')) { *(p3++)=(*p1); p2++; } else if(((*(p1-1))==(*(p2-1)))||((*(p2-1))=='?')) { p2=str2; p3=str; continue; } } if((*p2)=='\0') { (*p3)='\0'; puts(str); } putchar(10); return 0; } ```
C语言整数转字符串输出
#include <stdio.h> #include <string.h> void to_str(n) int n; { char s[10]; int i = 0; if(n<0) { putchar('-'); n = -n; } do { s[i++] = n%10 +'0'; n/=10; } while(n>0); while(i--)putchar(s[i]); } main() { int x,y; scanf("%d",&x); to_str(x); } 这里面的{ s[i++] = n%10 +'0';这行不懂,为什么要加'0',不加就不行呢,请赐教。
关于C语言中的递归与变量作用域问题
//递归法逆序输出字符串 #include<stdio.h> void reverse(char *sptr); void main() { char s[80]; printf("Enter a line of text:\n"); gets(s); printf("\nThe line printed backward is:\n"); reverse(s); printf("\n"); } void reverse(char *sptr) { if(*sptr=='\0') { return; } else { reverse(++sptr); putchar(*sptr); } } 最后两行中: reverse(++sptr); /这个++sptr使下面的putchar(*sptr)中的sptr地址也加了1是为什么 putchar(*sptr);
C语言 gets函数相关问题
``` #include<stdio.h> #include <stdlib.h> #include<conio.h> #include<String.h> int main() { FILE *fp; char ch; fp=fopen("F:\\啦啦.txt","at+"); /* if((fp=fopen("F:\\啦啦.txt","at+"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } ch=fgetc(fp); while (ch != EOF) { putchar(ch); ch=fgetc(fp); } *///这个过程是进行读数据的测试过程 //接下来进行语法分析 ch = getchar(); //这里回车作为输入结束 FILE *stream = stdin; int stdin_len = strlen(stream->_ptr); stream->_ptr[strlen(stream->_ptr)-2]='\0'; if (stdin_len > 0) { fputs(stream->_ptr-1, fp); //stream->_ptr 后面会带有\n\n 不需要就开空间复制前面的输入字符串 } char en[20]; gets(en); printf("%s",en);//测试gets函数效果 system("pause"); return 0; } ``` 我想测试下gets函数效果,这个函数就是运行的时候 ,等待用户输入,然后我弄了个输出,输出结果很变态![图片说明](https://img-ask.csdn.net/upload/201910/09/1570598808_700634.png) 输出结果 变少了 为什么呢。
友善之臂mini2440 运行uart裸板程序失败
用的板子是友善之臂mini2440,自己学习韦东山的一期视频,在写uart裸板程序时发现怎么都无法实现功能 s3c2440.h ``` /* GPIO寄存器 */ #define GPBCON (*(volatile unsigned int*)0x56000010) #define GPGCON (*(volatile unsigned int*)0x56000060) #define GPHCON (*(volatile unsigned int*)0x56000070) #define GPBDAT (*(volatile unsigned int*)0x56000014) #define GPGDAT (*(volatile unsigned int*)0x56000064) #define GPHUP (*(volatile unsigned int*)0x56000078) /* UART寄存器 */ #define UCON0 (*(volatile unsigned int*)0x50000004) #define UBRDIV0 (*(volatile unsigned int*)0x50000004) #define ULCON0 (*(volatile unsigned int*)0x50000028) #define UTRSTAT0 (*(volatile unsigned int*)0x50000010) #define UTXH0 (*(volatile unsigned char*)0x50000020) #define URXH0 (*(volatile unsigned char*)0x50000024) #define UFCON0 (*(volatile unsigned int*)0x50000008) #define UMCON0 (*(volatile unsigned int*)0x5000000C) #define UCON1 (*(volatile unsigned int*)0x50004004) #define UBRDIV1 (*(volatile unsigned int*)0x50004028) #define ULCON1 (*(volatile unsigned int*)0x50004000) #define UTRSTAT1 (*(volatile unsigned int*)0x50004010) #define UTXH1 (*(volatile unsigned char*)0x50004020) #define URXH1 (*(volatile unsigned char*)0x50004024) #define UFCON1 (*(volatile unsigned int*)0x50004008) #define UMCON1 (*(volatile unsigned int*)0x5000400C) ``` uart.h ``` #ifndef _UART_H #define _UART_H void uart0_init(); int putchar(int c); int getchar(void); int puts(const char *s); #endif ``` uart.c ``` #include "s3c2440.h" /* 设置引脚用于串口 */ void uart0_init() { GPHCON &= ~((3<<8)|(3<<10)); //清空GPH2,GPH3 GPHCON |= ((2<<8)|(2<<10)); //GPH4,GPH5用于TXD1,RXD1 GPHUP &= ~((1<<4)|(1<<5)); //使能内部上拉 UFCON0 = 0x00; //不使用FIFO UMCON0 = 0x00; //不使用流控 ULCON0 = 0x00000003; //设置数据格式8n1:8位数据位,无校验位,1停止位 UCON0 = 0x00000005; //PCLK,中断/查询模式 UBRDIV0 = 26; //设置波特率 115200 } int putchar(int c) { while(!(UTRSTAT0) & (1<<2)) UTXH0 = (unsigned char)c; } int getchar(void) { while(!(UTRSTAT0) & (1<<0)) return URXH0; } int puts(const char *s) { while(*s) { putchar(*s); s++; } } ``` main.c ``` #include "s3c2440.h" #include "uart.h" int main(void) { unsigned char c; uart0_init(); puts("hello,world!\n"); while(1) { c = getchar(); putchar(c); } return 0; } ``` start.S ``` .text .global _start _start: /*设置内存:sp 栈*/ ldr sp,=4096 /*nand启动*/ /* 关闭看门狗 */ ldr r0, =0x53000000 ldr r1, =0 str r1, [r0] /* 设置CPU工作于异步模式 */ mrc p15,0,r0,c1,c0,0 orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA mcr p15,0,r0,c1,c0,0 /* 设置MPLL,FCLK */ /* CLKDIVN(0x4c000014) = 0x5 */ ldr r0, =0x4c000014 ldr r1, =0x5 /* HCLK = FCLK/4 = 100 MHz , PCLK = HCLK/2 = 50MHz */ str r1, [r0] /* 设置MPLLCON(0x4c000004) = (92<<12)|(1<<4)|(1<<0) FCLK = 400 MHz*/ ldr r0, =0x4c000004 ldr r1, =(92<<12)|(1<<4)|(1<<0) str r1,[r0] /*调用main*/ bl main halt: b halt ``` Makefile ``` all: arm-linux-gcc -c -o uart.o uart.c arm-linux-gcc -c -o main.o main.c arm-linux-gcc -c -o start.o start.S arm-linux-ld -Ttext 0 start.o uart.o main.o -o uart.elf arm-linux-objcopy -O binary -S uart.elf uart.bin arm-linux-objdump -D uart.elf > uart.dis clean: rm *.bin *.o *.elf *.dis ``` 程序写完后扔到虚拟机里编译生成.bin文件,之后用友善之臂自己编写的下载工具进行烧写 ![图片说明](https://img-ask.csdn.net/upload/202001/07/1578379644_335442.png) 之后选择nand启动,连接串口,并没有看到返回字符串hello,world! 特来请教
C语言项目,功能8,9不能正常实现,求修改,按如图要求
![图片说明](https://img-ask.csdn.net/upload/201911/25/1574686303_298098.png) #include "stdio.h" #include "string.h"//字符串函数 #include "stdlib.h" #include"stdbool.h" long Fact(int n); long FactSum(int v); //函数的定义(作用:计算输入阶乘数的阶乘和,并将结果返回主函数 void displaymain()//显示主菜单 { printf("*******************\n"); printf("简易计算器\n"); printf("*******************\n"); printf("请选择\n"); printf("1:加法\n"); printf("2:减法\n"); printf("3:乘法\n"); printf("4:除法\n"); printf("5:求余\n"); printf("6:累加\n"); printf("7:阶乘\n"); printf("8:阶乘累加\n"); printf("9:退出系统\n"); } void password() { int i=0,temp; bool login_status=false; char password[10]={0}; //声明一个最多有十个元素的数组,并且初始化值为0; //for(i=0;i { for(i=0;i<3;i++) { printf("请输入密码:"); scanf("%s",password);//输入密码(字符串) if(strcmp("19491001",password)==0) { login_status=true; break; }else printf("密码错误,重新输入"); } if(true==login_status)//strcmp:比较两个字符串是否一样 { printf("登陆成功\n"); int choice,flag=0; void displaymain(); void plus(); void minus(); void multiply(); void divide(); void complementation(); void accumulation(); int factorial(); int factorialSum(); while(flag==0) { putchar('\n'); displaymain(); printf("please input a digital(1-7)\n"); scanf("%d",&choice); if(choice>=1&&choice<=7) switch(choice) { case 1:plus();break; case 2:minus();break; case 3:multiply();break; case 4:divide();break; case 5:complementation();break; case 6:accumulation();break; case 7:factorial();break; case 8:factorialSum();break; default:printf("选项输入错误!\n"); } else { printf("your inputs is error!\n");flag=1; } } getch(); //菜单 } else { printf("密码错误超过三次\n"); } } void plus() { double a,b,temp; printf("请输入以空格分隔的两个运算数:\n"); scanf("%lf %lf",&a,&b); temp=a+b; printf("结果是:%lf",temp); } void minus() { double a,b,temp; printf("请输入被减数与减数(并用空格隔开):\n"); scanf("%lf %lf",&a,&b); temp=a-b; printf("结果是:%f",temp); } void multiply() { double a,b,temp; printf("请输入以空格分隔的两个运算数:\n"); scanf("%lf %lf",&a,&b); temp=a*b; printf("结果是:%f",temp); } void divide() { double a,b,temp; printf("请输入被除数与除数(并用空格隔开):\n"); scanf("%lf %lf",&a,&b); if(b!=0) { temp=a/b; printf("结果是:%f",temp); } else printf("错误!\n"); } void complementation() { int a,b,temp; printf("请输入两个用空格隔开的运算数:\n"); scanf("%d %d",&a,&b); if(b!=0) { temp=a%b; printf("结果是:%d",temp); } else printf("错误!\n"); } void accumulation() { int n,temp; int a,sum=1; printf("请输入要求累加的数值:\n"); scanf("%d",&n); for(a=2;a<=n;a++) { sum+=a; } temp=sum; printf("累加和为:%d\n",temp); } int factorial() { int m; long ret,temp; printf("请输入想求的阶乘数:"); scanf("%d",&m); ret = Fact(m);//调用函数Fact(),并将函数的返回值存入ret if(ret==-1) printf("输入错误!\n"); else { temp=ret; printf("结果是:%d",temp); } return 0; } long Fact(int n)//函数的定义(作用:计算输入阶乘数的阶乘,并将结果返回主函数,且当n<0时,返回-1) { int i; long result = 1; if(n<0) { return -1; } else { for(i = 2;i<=n;i++) { result*=i; } return result; } } int factorialSum() { int m; long ret,temp; printf("请输入想求的阶乘和数:"); scanf("%d",&m); ret = FactSum(m);//调用函数Fact(),并将函数的返回值存入ret if(ret==-1) printf("输入错误!\n"); else temp=ret; return 0; } long FactSum(int v)//函数的定义(作用:计算输入阶乘数的阶乘和,并将结果返回主函数,且当n<0时,返回-1) { int i; long result=1,j = 1; if(v<0) { return -1; } else { for(i = 2;i<=v;i++) { j*=i; result+=j; } return result; } } void main() { int temp; password(); printf("运行结束"); }
为什么用gets函数会自动加一个空格?
``` #include<stdio.h> #include<string.h> int n; void g(char a[],int n) { int b; b=a[n]; printf("%c",b); if(n!=0) { n--; g(a,n); } } void main() { char a[20]; gets(a); n=strlen(a); g(a,n); putchar('\n'); } ``` 如代码所示,这是一个字符串的回文,但是为什么在主函数中gets会自动加一个空格?例如,我输入abc,a[]={"a","b","c"," ","\0"}。
C语言中字符数组作为函数返回值出现的问题
之前在这里问过这个问题,但可能是表述不清,收效甚微,今天再次提出这个问题,希望各位知情者能帮我解答一下,谢谢! 下面将简化后的代码贴出来: ```c #include <stdio.h> #define N 4 char *char_array(int n); int print_array(char *p, int n); int main(void) { char *p = NULL; p = char_array(N); print_array(p, N); return 0; } char *char_array(int n) { static char test[N] = {0}; int i = 0; for(i = 0; i < n; i++) test[i] = 'A'; return test; } int print_array(char *p, int n) { int i = 0; for(i = 0; i < n; i++) putchar(*(p+i)); putchar('\n'); return 0; } ``` 在子函数中字符数组做静态声明,是为了返回的数组首地址所指的那片内存不会因为子函数的调用完成而被释放掉。 下面贴出单步调试的过程: 设置断点,单步调试 ![断点调试](https://img-ask.csdn.net/upload/201705/10/1494405625_269125.png) 这是在return数组首地址之前看到的,数组元素正常 ![before return](https://img-ask.csdn.net/upload/201705/10/1494405713_786345.png) 这是在return后,从返回的首地址读取数组得到的,可以看到数组末尾多出了一个0x01的元素 ![after return](https://img-ask.csdn.net/upload/201705/10/1494405823_176945.png) 打开数组首地址对应的内存地址,可以清楚看到 ![memory](https://img-ask.csdn.net/upload/201705/10/1494405891_666688.png) 如果编译器将字符数组作为字符串的一种形式进行处理,在得到字符串的首地址之后,会向后一直搜索,直到搜索到'\0'为止,也可以理解,因为0x01后面就是'\0',但是为什么每次运行程序,后面都会多出一个0x01,而不是其他的什么字符,出现一次是巧合,但每次出现算是问题了吧。 希望有知道其中原因的能帮我解答一下,两个问题: 1.为什么后面会多一个元素? 2.为什么这个元素是0x01? 谢谢!
修改代码,按图示要求
#include "stdio.h" #include "string.h"//字符串函数 #include "stdlib.h" long Fact(int n); long FactSum(int v); //函数的定义(作用:计算输入阶乘数的阶乘和,并将结果返回主函数 void displaymain()//显示主菜单 { printf("*******************\n"); printf("简易计算器\n"); printf("*******************\n"); printf("请选择\n"); printf("1:加法\n"); printf("2:减法\n"); printf("3:乘法\n"); printf("4:除法\n"); printf("5:求余\n"); printf("6:累加\n"); printf("7:阶乘\n"); printf("8:阶乘累加\n"); printf("9:退出系统\n"); } void password() { int i=0,temp; char password[10]={0}; //声明一个最多有十个元素的数组,并且初始化值为0; printf("请输入密码:"); scanf("%s",password);//输入密码(字符串) if(strcmp("19491001",password)==0)//strcmp:比较两个字符串是否一样 { printf("登陆成功\n"); int choice,flag=0; void displaymain(); void plus(); void minus(); void multiply(); void divide(); void complementation(); void accumulation(); int factorial(); int factorialSum(); void tuichu(); while(flag==0) { putchar('\n'); displaymain(); printf("please input a digital(1-7)\n"); scanf("%d",&choice); if(choice>=1&&choice<=7) switch(choice) { case 1:plus();break; case 2:minus();break; case 3:multiply();break; case 4:divide();break; case 5:complementation();break; case 6:accumulation();break; case 7:factorial();break; case 8:factorialSum();break; case 9:tuichu();break; default:printf("选项输入错误!\n"); } } getch(); //菜单 } else { printf("密码错误\n"); } } void plus() { double a,b,temp; printf("请输入以空格分隔的两个运算数:\n"); scanf("%lf %lf",&a,&b); temp=a+b; printf("结果是:%lf",temp); } void minus() { double a,b,temp; printf("请输入被减数与减数(并用空格隔开):\n"); scanf("%lf %lf",&a,&b); temp=a-b; printf("结果是:%f",temp); } void multiply() { double a,b,temp; printf("请输入以空格分隔的两个运算数:\n"); scanf("%lf %lf",&a,&b); temp=a*b; printf("结果是:%f",temp); } void divide() { double a,b,temp; printf("请输入被除数与除数(并用空格隔开):\n"); scanf("%lf %lf",&a,&b); if(b!=0) { temp=a/b; printf("结果是:%f",temp); } else printf("错误!\n"); } void complementation() { int a,b,temp; printf("请输入两个用空格隔开的运算数:\n"); scanf("%d %d",&a,&b); if(b!=0) { temp=a%b; printf("结果是:%d",temp); } else printf("错误!\n"); } void accumulation() { int n,temp; int a,sum=1; printf("请输入要求累加的数值:\n"); scanf("%d",&n); for(a=2;a<=n;a++) { sum+=a; } temp=sum; printf("累加和为:%d\n",temp); } int factorial() { int m; long ret,temp; printf("请输入想求的阶乘数:"); scanf("%d",&m); ret = Fact(m);//调用函数Fact(),并将函数的返回值存入ret if(ret==-1) printf("输入错误!\n"); else { temp=ret; printf("结果是:%d",temp); } return 0; } long Fact(int n)//函数的定义(作用:计算输入阶乘数的阶乘,并将结果返回主函数,且当n<0时,返回-1) { int i; long result = 1; if(n<0) { return -1; } else { for(i = 2;i<=n;i++) { result*=i; } return result; } } int factorialSum() { int m; long ret,temp; printf("请输入想求的阶乘和数:"); scanf("%d",&m); ret = FactSum(m);//调用函数Fact(),并将函数的返回值存入ret if(ret==-1) printf("输入错误!\n"); else temp=ret; return 0; } long FactSum(int v)//函数的定义(作用:计算输入阶乘数的阶乘和,并将结果返回主函数,且当n<0时,返回-1) { int i; long W=1,j = 1; if(v<0) { return -1; } else { for(i = 2;i<=v;i++) { j*=i; W+=j; } return W; } } void tuichu() { printf("已退出"); } void main() { int temp; password(); printf("结果是:%lf",temp); } ![图片说明](https://img-ask.csdn.net/upload/201911/25/1574687755_948559.png)
C语言程序用fputc函数写入字符到建立的文件中,程序运行正常,可是资源管理器里找不到建立的新文件?
//怎样向文件读写字符 #include<stdio.h> #include<stdlib.h> int main() { FILE * fp;//定义指向文件的指针 char ch,filename[10];//ch代表输入的字符变量,filename代表文件名 printf("请输入所用的文件名:"); scanf("%s",filename);//输入文件名 if((fp = fopen(filename,"w")) == NULL)//打开文件并使fp指向此文件 { printf("无法打开此文件\n");//如果打不开信息出错 exit(0);//终止程序 } ch = getchar();//用来接收最后的回车字符 printf("请输入一个准备存储到磁盘的字符串(以#结束):"); ch = getchar();//接收从键盘输入的第一个字符 while(ch != '#')//当输入#时结束 { fputc(ch,fp);//向磁盘文件输出一个字符 putchar (ch);//将输出的字符显示在屏幕上 ch = getchar();//再接受从键盘输入的一个字符 } fclose(fp);//关闭文件 putchar (10);//向屏幕输出一个换行符 return 0; }
输出结果统计各字符的数量不正确。
#include <stdio.h> #include <string.h> int main () { char ch; int m=0,n=0,p=0,count = 0; FILE *fp = fopen("STRING.txt", "w+"); if (fp!=NULL) { printf("请输入要保存的字符串:\n"); ch = getchar(); while (ch!='\n') { count++; fputc(ch, fp); ch = getchar(); } printf("本次一共写入了%d个字符\n",count); printf("\n"); rewind(fp); ch = fgetc(fp); while (ch!=EOF) { putchar(ch); ch = fgetc(fp); if (ch>='0'&&ch<='9') m++; else if (ch>='A'&&ch<='Z'||ch>='a'&&ch<='z') n++; else p++; } printf("\n"); printf("数字有%d个\n字母有%d个\n其他字符有%d个\n",m,n,p); } fclose(fp); return 0; }
C语言课后题,答案不对?
输入一串字符以‘#’结束,如果它是大写字母,则转换为小写字母输出,如果是小写字母,则转换为大写字母输出,如果不是字母,则照直输出 while((ch=getchar())!="#") {if(ch>="A"&&ch<="Z") ch=ch-"A"+"a"; else if(ch>="a"&&ch<="z") ch=ch-"a"+"A"; putchar(ch); } 答案为什么不对
C语言求解,简单问题求解
在C语言里,定义整型变量a可以使用语句: int a; 而定义一重指针变量p1指向a变量,即把a变量的地址储存在指针变量p1里,可以使用语句: int *p1; p1 = &a; 若要通过p1访问变量a,应该使用: *p1 定义二重变量p2指向p1指针,即把p1的地址存储在p2里,可以使用: int *p2; p2 = &p1; 由于p1之前已经指向a,因此通过p2可以访问到a变量,使用: **p2 以此类推...... 现在给出一个x重指针变量的定义,并假设之前已经定义过1重,2重,...,x-1重指针变量,而且已经将1重指针变量指向a变量,2重指针指向1重指针,...,x重指针指向x-1重指针。 问如何通过x重指针访问变量a? 输入 输入数据有多组,每组只描述x重指针变量的定义,定义格式为: intX Y; 其中X为若干个*,Y遵守C语言标识符命名规则。每行总长度不超过100个字符。 输入直到文件结束为止。 输出 每组输出一行,每行输出一串字符,表示如何通过定义的指针访问a变量,不留空格。 样例输入 int* p; int** prr; int**** yyy; 样例输出 *p **prr ****yyy 我的代码 #include<stdio.h> int main() { char str[101]; char* p; int i; while(scanf("%c",str)!=EOF) { for(i=1;*(str+i)=getchar(),str[i]!=';';i++); str[i]='\0'; for(i=0;*(str+i)!='*';i++); for(;*(str+i)=='*';i++) { putchar('*'); } for(;*(str+i)==' ';i++); printf("%s\n",str+i); } return 0; } 哪里错了
新手学习C语言到文件顺序读写一节,求助帮忙理解程序,请备注就行!
//怎样向文件读写字符,本体我的问题是为什么没有用fgetc函数逐渐输入字符,还有为什么我在资源管理器里找不到新建的文件? #include<stdio.h> #include<stdlib.h> int main() { FILE * fp; char ch,filename[10]; printf("请输入所用的文件名:"); scanf("%s",filename); if((fp = fopen("filename","w")) == NULL) { printf("无法打开此文件\n"); exit(0);//终止程序 } ch = getchar();//这个语句不理解, printf("请输入一个准备存储到磁盘的字符串(以#结束):"); ch = getchar(); while(ch != '#') { fputc(ch,fp); putchar (ch); ch = getchar(); } fclose(fp); putchar (10); return 0; }
新手学习C语言文件,问题已经在程序中备注,求解答!
//怎样向文件读写字符 #include<stdio.h> #include<stdlib.h> int main() { FILE * fp; char ch,filename[10]; printf("请输入所用的文件名:"); scanf("%s",filename); if((fp = fopen(filename,"w")) == NULL)//为什么这里的filename没有双引号引起来; { printf("无法打开此文件\n"); exit(0);//终止程序 } ch = getchar();//这个语句不理解 printf("请输入一个准备存储到磁盘的字符串(以#结束):"); ch = getchar(); while(ch != '#') { fputc(ch,fp); putchar (ch); ch = getchar(); } fclose(fp); putchar (10); return 0; }
Segmentation fault问题
//c语言实现输入任意长度的字符串 #include <stdio.h> #include <stdlib.h> int main (void ) { char *string = NULL ,*temp = NULL; char ch; int i; //先将字符串初始化为空 string = (char *)malloc(1); string[0] = '\0'; //len为实际长度(包括空字符) int len = 1; while ((ch = getchar())!= '\n') { //申请一个新字符串 temp = (char *)malloc(len+1); if (temp = NULL) { printf("内存不足!"); free(string); exit(0); } i=0; while (string[i] != '\0'&&i<len) { //把原字符串复制到新字符串 temp[i] = string[i]; i++; } //把新字符归位 temp[i] = ch; //把空字符归位 temp[i+1] = '\0'; //释放源字符,这一步很关键,否 //则会造成内存泄露 free(string); string = temp; len++; } int j=0; while (string[j]!='\0') { putchar(string[j]); j++; } return 0; } 运行时显示Segmentation fault怎么办?
有个C语言的代码,不知道哪有问题,就是运行有误,求指点
要求实现:输入: this is a dig. 输出:This Is A Dog. 即把字符串中单词首字母变为大写,若已经是大写或者其他字符,则不变,单词间用空格隔开。 ``` #include <stdio.h> int main() { char *p[50],**t; int n; t=p; do { scanf("%s",*t); t++; }while(getchar()!='\n'); n=t-p; for(t=p;t<p+n;t++) { if(((**t)>='a')&&((**t)<='z')) (**t)=(**t)-32; printf("%s ",*t); } putchar(10); return 0; } ```
这份写法错在哪里?郁闷了
1.题目:写一函数,将一个字符串中的元音字母复制到另一个字符串,然后输出。 输入 一行字符串 输出 顺序输出其中的元音字母(aeiou) 样例输入 abcde 样例输出 ae **尝试了各种方法,编译运行都是提示运行错误50%,点开又没有辅助办法,遂上来问问大家。 尝试的办法: 1.修改程序只输出不相同的元音字母,结果也是错误50% 2.不在函数中输出结果,也是一样; 3.用putchar 和 puts输出也是一样; 自己试了好多字符串,结果都是正确的呀。 ** ``` #include <stdio.h> #include <string.h> int f1 (char a[],char b,int lim); char getline(char s[],char a[]); int main() { char a[15]; char b[15]; char c[6]; gets (a); getline (b,a); int len = strlen (b); int i=0; int j=0; int x=0; puts(b); return 0; } int f1 (char a[],char b,int lim){ //将当前欲输出的项与C【】做比较,不存在返回1,存在返回0 int i=0; int j=0; int equ=1; for(i=0;i<lim;i++){ if(b == a[i]) { equ=0; break; } if(b != a[i]) { equ =1; } } return equ; } char getline(char s[],char a[]){ int i=0; int k=0; while (a[i]){ if(a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o'\ ||a[i] == 'u' ||a[i] == 'A' || a[i] == 'E' || a[i] == 'I' || a[i] == 'O'\ || a[i] == 'U') { s[k]=a[i]; k++; } i++; } s[k]='\0'; return *s; } ```
Kafka实战(三) - Kafka的自我修养与定位
Apache Kafka是消息引擎系统,也是一个分布式流处理平台(Distributed Streaming Platform) Kafka是LinkedIn公司内部孵化的项目。LinkedIn最开始有强烈的数据强实时处理方面的需求,其内部的诸多子系统要执行多种类型的数据处理与分析,主要包括业务系统和应用程序性能监控,以及用户行为数据处理等。 遇到的主要问题: 数据正确性不足 数据的收集主要...
volatile 与 synchronize 详解
Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个执行的线程还是可以拥有一份拷贝,这样做的目的是加速程序的执行,这是现代多核处理器的一个显著特性),所以程序在执行过程中,一个线程看到的变量并不一定是最新的。 volatile 关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
GitHub开源史上最大规模中文知识图谱
近日,一直致力于知识图谱研究的 OwnThink 平台在 Github 上开源了史上最大规模 1.4 亿中文知识图谱,其中数据是以(实体、属性、值),(实体、关系、实体)混合的形式组织,数据格式采用 csv 格式。 到目前为止,OwnThink 项目开放了对话机器人、知识图谱、语义理解、自然语言处理工具。知识图谱融合了两千五百多万的实体,拥有亿级别的实体属性关系,机器人采用了基于知识图谱的语义感...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
微信支付崩溃了,但是更让马化腾和张小龙崩溃的竟然是……
loonggg读完需要3分钟速读仅需1分钟事件还得还原到昨天晚上,10 月 29 日晚上 20:09-21:14 之间,微信支付发生故障,全国微信支付交易无法正常进行。然...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
相关热词 c# 二进制截断字符串 c#实现窗体设计器 c#检测是否为微信 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片
立即提问