c - 如何在读取字符串时获取排除空终止符



该程序会打开一个文件,其中包含湖泊的名称及其体积(以数百立方英里为单位),由空格分隔。它的输出应该是湖泊的名称,后跟一些星号,以表示其体积到最接近的一百立方英里(例如,体积为 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);
}

最新更新