此程序打开一个文件,其中包含一个湖泊的名称及其以数百立方英里为单位的体积(以空格分隔)。它的输出应该是湖泊的名称后跟一些星号,以表示其体积,精确到百立方英里(例如,一个体积为 12.7 百立方英里的湖泊将打印 13 个星号)。但是,当它读入包含空格的名称时,它会一直读到空格,然后在新行中打印下一个字符串。有什么办法可以让我将“gross dirty lake”读成一行而不是“gross\ndirty\nlake”吗?这是我到目前为止所拥有的:
#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 data\n");
break;
}
name_asterisks(name, vol);
}
""
: 跳过空格。
"%19[A-Za-z ]"
:扫描并保存最多19个字母或空格,附加'\0'
。
"%f"
:跳过空格并保存扫描 float
。
关于原始代码的注意事项:最好检查代码想要什么,而不是检查 1 个不需要的结果
// while (fscanf(fp, "%s %f", name, &vol) != EOF) {
while (fscanf(fp, "%s %f", name, &vol) == 2) {
关于c - 读取字符串时如何排除空终止符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30902337/