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) 输出结果 变少了 为什么呢。
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("运行结束"); }
友善之臂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! 特来请教
为什么用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? 谢谢!
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"//字符串函数 #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)
输出结果统计各字符的数量不正确。
#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; } ```
C语言对用堆导入并显示的数据进行进一步的处理
原题目:求转录RNA组的平均值与标准差(英文翻译过来的) 附加条件:给了一个200多M的文件(数据,可以以txt,csv等形式打开 ) 拿到题目以后解读数据就费了好长时间,数据中的名称全是英文,看了好半天才明白是怎么一回事想到定义数组发现定不了那么大,从网上学了malloc可是完全不知道引入文件后怎么将其导入数组内,试着将网上的程序拼接结果不行。////这时得到了堆空间这个名词,紧接着直接搜出了导入csv文件的相关代码(这里解释一下,这是大学老师布置的一道题,老师只教了我们谭浩强的红皮书就出这样的题目。。。老师也跟我们说了考验我们获取信息的能力。。。只是交作业不算抄袭吧?),就直接粘上了,然后逐行的读懂了这个程序,能够很顺利的用运行显示出所有数据,但是我想进一步做的时候发现自己需要将没一行数据单独进行运算,而这个程序是检测后直接一个个的将一整行显示了,所以我不知道该怎么进行下一步的数据处理。(其实这个程序的核心部分我也只是知道单独行的意思,整体的功能实现并不是太确定)求哪位好心人帮忙给讲一下怎么对导入的数据进行处理。自己的水平实在是不够了。 谢谢了。 #include <stdio.h> #include <stdlib.h> #include <string.h> int getFilelen(FILE * file)//2.2.0----getfile...函数---- 主要是做逐行读取功能并记录行数 { int len = 0;//2.2.1---定义了一个len=0其意义暂时不知---- if (file == NULL) { return -1;//2.2.2如果文件为空(或不存在??????????)直接结束 } char buf[1024];//2.2.3定义一个大小为1024的一维数组(1024有无特殊含义???????) //读取每一行 while (fgets(buf, 1024, file) != NULL)//2.2.4---- 将fp中的内容按1024字节大小读入text中,然后输出。直到读到fp的末尾,为空了。停止读取,然后关闭文件。 -----解释了1024的问题 { len++; //printf("%d ",len); } //设置光标 fseek(file, 0, SEEK_SET);//2.2.5---函数。。。跳到 ---错了。。。 意思是把文件指针指向文件的开头 return len;//2.2.6----返回len----此时回到77行继续运行程序 } void readFileData(FILE * file, int len, char ** pArray) //2.3.1文件指针 长度 堆区数组----read为函数名的函数,其意义因该为读取吧 ---读取到数组??? { if (file == NULL || len <= 0 || pArray == NULL)//2.3.2--如果存在什么不合理的情况,直接结束 { return; } char buf[1024]; //读取每一行 int index = 0; while (fgets(buf, 1024, file) != NULL)//同14行 { int currentlen = strlen(buf) + 1;//strlen() 这个函数是返回一个字符串中的字符个数,不包括结束符 '\0'; char * currenP = (char *)malloc(sizeof(char) * currentlen); strcpy(currenP, buf);//复制BUF ,buf包含整个数据库?? pArray[index++] = currenP;//将buf放进数组??? // printf("%d ",pArray[index++] ); memset(buf, 0, 1024);// 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值----转换为ascii之后方便计算?---- }//回79行 } void showFileData(char ** pArray, int len)//以show为开头的函数,其意义因该为展示,显示吧----- { for (int i = 0; i < len; i++) { int qwe=i; printf("第%d行内容:%s\n", i+1, pArray[i]);//证实parray实际上包含了数据库 // printf("第%d行数据:%s\n",i+1,pArray[qwe+1]); } }//回80行 void freeSpace(char ** pArray, int len)//不用想了,释放空间,翻译一下就出来了 { if (pArray == NULL || len == NULL) { return; } for (int i = 0; i < len; i++) { if (pArray[i] != NULL) { free(pArray[i]); pArray[i] = NULL; } } }//回81行 int test01()//2.1.0----test01函数,整个程序的主体部分(之后的\n和system只是辅助,显示的好看一些,没有什么意义) -----此函数意义仍为一个目录,具体操作在其他函数中 { FILE * file = fopen("transcript_rna_tissue.csv", "r");//2.1.1打开文件,如果不存在或者打不开的话输出72内容,结束程序。 if (file == NULL) { printf("打开文件失败!\n"); return 0; } int len= getFilelen(file);//2.1.2----定义(调用)函数get...-----程序跳转至第5行 char ** pArray = (char **)malloc(sizeof(char *) * len);//2.2.0---定义一个符合文件大小要求的堆空间????? readFileData(file, len, pArray);//2.3.0---函数,跳到25行 -----------去掉这一行数据显示为 第i行数据:(null) showFileData(pArray, len);//到45行 ----------去掉程序不再运行 freeSpace(pArray, len);//到52行 -----可以去掉,不影响显示 pArray = NULL;//将PARRAY定回空----回87行 } int main()//1.0.0--定义主函数,程序的真正开端 { test01();//2.0.0--调用函数 test01-----程序跳转到第67行 putchar('\n'); system("pause"); }//结束
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
死磕YOLO系列,YOLOv1 的大脑、躯干和手脚
YOLO 是我非常喜欢的目标检测算法,堪称工业级的目标检测,能够达到实时的要求,它帮我解决了许多实际问题。 这就是 YOLO 的目标检测效果。它定位了图像中物体的位置,当然,也能预测物体的类别。 之前我有写博文介绍过它,但是每次重新读它的论文,我都有新的收获,为此我准备写一个系列的文章来详尽分析它。这是第一篇,从它的起始 YOLOv1 讲起。 YOLOv1 的论文地址:https://www.c
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片
简明易理解的@SpringBootApplication注解源码解析(包含面试提问)
欢迎关注文章系列 ,关注我 《提升能力,涨薪可待》 《面试知识,工作可待》 《实战演练,拒绝996》 欢迎关注我博客,原创技术文章第一时间推出 也欢迎关注公 众 号【Ccww笔记】,同时推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 《提升能力,涨薪可待篇》- @SpringBootApplication注解源码解析 一、@SpringBootApplication 的作用是什
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
Python语言高频重点汇总
Python语言高频重点汇总 GitHub面试宝典仓库——点这里跳转 文章目录Python语言高频重点汇总**GitHub面试宝典仓库——点这里跳转**1. 函数-传参2. 元类3. @staticmethod和@classmethod两个装饰器4. 类属性和实例属性5. Python的自省6. 列表、集合、字典推导式7. Python中单下划线和双下划线8. 格式化字符串中的%和format9.
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
ES6基础-ES6的扩展
进行对字符串扩展,正则扩展,数值扩展,函数扩展,对象扩展,数组扩展。 开发环境准备: 编辑器(VS Code, Atom,Sublime)或者IDE(Webstorm) 浏览器最新的Chrome 字符串的扩展: 模板字符串,部分新的方法,新的unicode表示和遍历方法: 部分新的字符串方法 padStart,padEnd,repeat,startsWith,endsWith,includes 字
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
web前端javascript+jquery知识点总结
Javascript javascript 在前端网页中占有非常重要的地位,可以用于验证表单,制作特效等功能,它是一种描述语言,也是一种基于对象(Object)和事件驱动并具有安全性的脚本语言 ,语法同java类似,是一种解释性语言,边执行边解释。 JavaScript的组成: ECMAScipt 用于描述: 语法,变量和数据类型,运算符,逻辑控制语句,关键字保留字,对象。 浏览器对象模型(Br
Qt实践录:开篇
本系列文章介绍笔者的Qt实践之路。 背景 笔者首次接触 Qt 大约是十多年前,当时试用了 Qt ,觉得不如 MFC 好用。现在 Qt 的 API、文档等都比较完善,在年初决定重新拾起,正所谓技多不压身,将 Qt 当为一种谋生工具亦未尝不可。利用春节假期的集中时间,快速专攻一下。 本系列名为“Qt实践”,故不是教程,笔者对 Qt 的定位是“使用”,可以帮助快速编写日常的工具,如串口、网络等。所以不
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
一条链接即可让黑客跟踪你的位置! | Seeker工具使用
搬运自:冰崖的部落阁(icecliffsnet) 严正声明:本文仅限于技术讨论,严禁用于其他用途。 请遵守相对应法律规则,禁止用作违法途径,出事后果自负! 上次写的防社工文章里边提到的gps定位信息(如何防止自己被社工或人肉) 除了主动收集他人位置信息以外,我们还可以进行被动收集 (没有技术含量) Seeker作为一款高精度地理位置跟踪工具,同时也是社交工程学(社会工程学)爱好者...
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧...... 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
相关热词 c# 时间比天数 c# oracle查询 c# 主动推送 事件 c# java 属性 c# 控制台 窗体 c# 静态类存值 c#矢量作图 c#窗体调用外部程式 c# enum是否合法 c# 如何卸载引用
立即提问