该程序会打开一个文件,其中包含湖泊的名称及其体积(以数百立方英里为单位),由空格分隔。它的输出应该是湖泊的名称,后跟一些星号,以表示其体积到最接近的一百立方英里(例如,体积为 12.7 百立方英里的湖泊将打印 13 个星号)。但是,当它读取包含空格的名称时,它会读取直到空格,然后在新行中打印下一个字符串。有没有办法将"总脏湖"读成一行而不是"粗鲁脏湖"?这是我到目前为止所拥有的:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void name_asterisks(char name[20], float vol);
main() {
FILE *fp;
fp = fopen("lakes.txt", "r");
char name[20];
float vol;
if (fp == NULL) {
printf("File does not exist.n");
system("pause");
return 0;
}
while (fscanf(fp, "%s %f", name, &vol) != EOF) {
name_asterisks(name, vol);
}
fclose(fp);
system("pause");
}
void name_asterisks(char name[20], float vol) {
int i;
printf("%s", name);
for (i = 0; i < (int)roundf(vol); i++)
printf("*");
printf("n");
}
"%s"
用于扫描非空白区域。 代码需要不同的格式说明符。
char buf[100];
while (fgets(buf, sizeof buf, fp) != NULL) {
if (sscanf(buf, " %19[A-Za-z ]%f", name, &vol) != 2) {
fprintf(stderr, "Unexpected datan");
break;
}
name_asterisks(name, vol);
}
" "
:跳过空格。
"%19[A-Za-z ]"
:扫描并保存最多19个字母或空格,附加' '
。
"%f"
:跳过空格并保存扫描float
。
关于原始代码的注意事项:最好检查代码想要什么,而不是检查 1 个不需要的结果
// while (fscanf(fp, "%s %f", name, &vol) != EOF) {
while (fscanf(fp, "%s %f", name, &vol) == 2) {
like 的示例为 gross dirty lake 12.7n
#include <string.h> //for strrchr
...
char line[64];//line buffer
...
while (fgets(line, sizeof line, fp)){
char *p = strrchr(line, ' ');//search last ' '
*p = ' ';
//snprintf(name, sizeof(name), "%s", line);
vol = atof(p+1);
name_asterisks(line, vol);//name_asterisks(name, vol);
}