如何在读取字符串时排除null终止符?

该程序打开一个文件,其中包含湖泊的名称及其体积,以数百立方英里为单位 – 以空格分隔。 它的输出应该是湖的名字,后面跟着一些星号来表示它的体积到最接近的百立方英里(例如,一个体积为12.7百立方英里的湖泊会打印13个星号)。 但是,当它读入包含空格的名称时,它将一直读到该空格,然后在新行中打印下一个字符串。 有什么办法可以把“脏兮兮的湖”看作一条线而不是“粗糙的\ ndirty \ nlake”吗? 这是我到目前为止所拥有的:

#include  #include  #include  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) { 

样品像gross dirty lake 12.7\n

 #include  //for strrchr ... char line[64];//line buffer ... while (fgets(line, sizeof line, fp)){ char *p = strrchr(line, ' ');//search last ' ' *p = '\0'; //snprintf(name, sizeof(name), "%s", line); vol = atof(p+1); name_asterisks(line, vol);//name_asterisks(name, vol); }