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

标签 c string file-io

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

相关文章:

python - 正则表达式:排除基于非捕获组的结果?

从 .txt 文件中计算数字

networking - 来自 sk_buff 的 ARP header 完全错误(linux 内核模块)

c# - 在 C# 中过滤逗号分隔的字符串

c++ - 通过 "\0"而不是 memset() 批量初始化 char 数组

java - 字符串已定义但未解析?

python - 如何将png文件放入字符串并将其写入另一个文件

c++ - 复制时使用的理想内存块大小是多少?

c - 如何调试 "INT_MAX undeclared"

c - 调用 C/Fortran 例程时忽略 evalWithTimeout?