#include <stdio.h> int main() { char str[100]; int count = 0; int i=0; while((str[i]=getchar())!='\n'){ i=i+1; } str[i]='\n'; for (int i = 0; str[i] != '\n'; i++) { if (str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' || str[i] == 'u') { count++; } } printf("%d", count); return 0; }不改变while的情况下的优化
时间: 2023-10-25 13:09:56 浏览: 121
可以使用 fgets() 函数代替 while 循环读入字符串,同时可以使用一个变量记录字符串的长度,避免每次循环都要判断是否为 '\n'。另外,在计算元音字母数量时,可以使用 switch 语句代替多个 if 语句,使代码更加简洁。优化后的代码如下:
```
#include <stdio.h>
int main() {
char str[100];
int count = 0;
int len = 0;
fgets(str, 100, stdin);
while (str[len] != '\n') {
len++;
}
for (int i = 0; i < len; i++) {
switch (str[i]) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
count++;
break;
default:
break;
}
}
printf("%d", count);
return 0;
}
```
相关问题
#include<stdio.h> #include<time.h> #include<stdlib.h> #include<sys/ipc.h> #include<sys/shm.h> #include<string.h> #include <fcntl.h> #include <sys/types.h> #include<unistd.h> struct shared_msg{ char text[BUFSIZ]; int update; }; int num1,num2,i=0,count=0; static int shmid; char str1[100]={0},str2[100]={0},temp; struct shared_msg *msg=NULL; int main(){ //创建共享内存 shmid=shmget((key_t)1234,sizeof(struct shared_msg),IPC_CREAT); if(shmid<0){printf("错误,key 对应的共享内存已存在");exit(-1);} //映射共享内存 msg=(struct shared_msg *)shmat(shmid,0,0); if( msg < (struct shared_msg *)0){ printf("映射内存出错!\n"); exit(-2);} while(1){ while(msg->update==1||strcmp(msg->text,"end")==0){ //在屏幕上打印计算式 if(strcmp(msg->text,"end")==0){ printf("%s\n",msg->text); sprintf(msg->text,"over");return 0;} else {printf("%s\n",msg->text);} //获取第一个数据 if(msg->text[1]!='+'){ memcpy(str1,msg->text,2); str1[2]='\0';} else { memcpy(str1,msg->text,1); str1[1]='\0';} num1 = atoi(str1); //获取第二个数据 if(msg->text[1]!='+'){memcpy(str2,msg->text+3,2);} else {memcpy(str2,msg->text+2,2);} str2[2]='\0'; num2=atoi(str2); //把计算后的结果写入缓冲区 num1=num1+num2; sprintf(msg->text,"%d",num1); msg->update=0; } } return 0; }
这段代码是一个使用共享内存实现的简单计算器程序。它创建了一个共享内存区域,在进程间共享数据。其中 struct shared_msg 结构体定义了共享内存中的数据结构,包含一个字符串和一个整数,分别表示计算式和是否需要更新的标志。程序通过循环读取共享内存中的数据,当需要更新数据时,获取计算式中的两个数值,将它们相加后写入共享内存中,等待另一个进程读取。程序可以通过在计算式中输入 "end" 命令来结束运行。
#include<stdio.h> #include<string.h> int main() { FILE *fp; fp=fopen("in.txt","r"); if(fp==NULL) { perror("failed"); return 1; } char str[81]; int i=0; while(fgets(str,81,fp)!=NULL) { i++; fgets(str,81,fp); } printf("%d",i); fclose(fp); return 0; }为什么这样写不对
这个程序的问题在于 `fgets()` 函数调用了两次,在循环中,每次读取文件都应该调用 `fgets()` 函数一次,否则会出现漏读或重复读的情况。因此,正确的做法是将第二个 `fgets()` 函数调用去掉即可。
以下是修改后的程序:
```c
#include <stdio.h>
#include <string.h>
int main() {
FILE *fp;
fp = fopen("in.txt", "r");
if (fp == NULL) {
perror("failed");
return 1;
}
char str[81]; // 多开一个字符用于存储 '\0'
int count = 0;
while (fgets(str, 81, fp) != NULL) {
count++;
}
printf("%d\n", count);
fclose(fp);
return 0;
}
```
这个程序只调用了一次 `fgets()` 函数,每次循环都只读取一行,并将行数计数器加一。
阅读全文