C程序 - 使用scanf在字符串中扫描但从.txt文件中读取

时间:2014-02-14 15:58:09

标签: c loops scanf

我有一个使用句子

创建.txt文件的作业
 "The quick brown fox jumps over the lazy dog." 

我将其命名为pangram.txt并被指示在gcc -o ...之后使用以下方式扫描:

myprogram_bin < pangram.txt

但是,我正在尝试查找字母'e''x'的出现次数。我的程序返回'e'的正确数字,但返回'x' 5次。我必须让它返回“已找到字符_”的说法。每次输入作为输入的字符时。我不确定这是不是我的循环,或者我是否需要使用const char * pangram来调用我的srting。有关如何纠正我的问题并使用标准输入扫描文件(无法在我的代码中读取文件)的任何帮助都会很棒!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void  problem_01_function(char char_to_find);

int main(){

    problem_01_function('e');
    problem_01_function('x');
    return 0;

}

void problem_01_function(char char_to_find){


    char pangram[50];
    scanf("%s", &pangram);
    int count_char_occur = 0;
    for(; count_char_occur < strlen(pangram);count_char_occur++)
    {
            if(pangram[count_char_occur] = char_to_find)
            {
                    printf("The character %c has been found. \n", char_to_find);
            }
    }
}

4 个答案:

答案 0 :(得分:1)

1)如果你要扫描整个字符串

"The quick brown fox jumps over the lazy dog." 

只有1个scanf()

然后你不必使用“%s”。您必须使用其他格式:

scanf("%49[^.]", &pangram);

2) 比较:

if(pangram[count_char_occur] = char_to_find)

应该是

if(pangram[count_char_occur] == char_to_find)

3)您可以使用fscanf()代替scanf()。这将避免使用< pangram.txt选项

调用您的程序

答案 1 :(得分:0)

#include <stdio.h>

void  problem_01_function(char char_to_find);

int main(){
    problem_01_function('e');
    rewind(stdin);
    problem_01_function('x');
    return 0;
}

void problem_01_function(char char_to_find){
    int ch;
    while((ch = fgetc(stdin))!=EOF){
        if(ch == char_to_find)
            printf("The character %c has been found. \n", char_to_find);
    }
}

答案 2 :(得分:0)

你可以这样做:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * readme = "/Desktop/readme.txt";

void  problem_01_function(char char_to_find);

int main()
{
    problem_01_function('e');
    problem_01_function('x');
    return 0;
}

void problem_01_function(char char_to_find)
{
    int fd = 0 , count_char_occur = 0;
    char read_buff[50];
    fd = open(readme, O_RDONLY);
    read(fd, read_buff, 50);
    for(count_char_occur = 0; count_char_occur < strlen(read_buff); count_char_occur++)
    {
        if(read_buff[count_char_occur] = char_to_find)
        {
                printf("The character %c has been found. \n", char_to_find);
        }
    }
}

答案 3 :(得分:0)

修改 - 抱歉,我误读了 - 如果您不允许从文件中读取内容,请修改fgets行,以便从stdin而非{{ 1}},并省略所有pfilefopen内容。

fclose

并编译并运行:

void read_in_string_stdin (char pangram[]){
  printf("please enter the pangram\n");
  if (fgets(pangram, 50, stdin) == NULL) {
/* stuff */
}

要从文件中读取,您需要使用fopen打开文件,使用fscanffgets阅读,检查返回值,然后关闭文件fclose

  • 如果您将gcc -Wall -o zpg pangram.c ./zpg < pangram_file.txt fscanf字符串一起使用,它将在遇到的第一个空格处停止 - 因此使用%s%[^.]格式标记代替,分别读到第一个句号或换行符。

  • 如果您使用%[^\n],则会一直读取,直到读取了换行符或限制数量的字符。

此外,您在fgets循环中确实存在分配与平等测试问题。


在风格上,围绕变量和函数的命名还存在一些问题(不是计算机上的错误产生,而是读者容易出错)。

  • 按功能命名功能,而不是按问题编号等元数据命名。
  • 上面的if变量具有误导性,因为它不计算所搜索的字符的出现次数。
  • 最好保持count_char_occur - 循环条件尽可能自包含,以防后续复制/粘贴(例如“我已将其粘贴到其他地方并且......再次初始条件是什么? “)

这是一个有效和美化的版本:

for

现在你看到了这个,这个人有很多责任,每个职能委派一个职责更有意义,不是吗?有一个函数处理字符串的读入,另一个函数处理事件的计数。然后你也没有重复读取字符串中的工作,以便为要在同一个字符串中计算的每个不同的字符添加。

 void count_occurrences(char char_to_find) {
   /* Problem 01 function. */

   char pangram[50];
   FILE *pfile = fopen("pangram_file.txt", "r"); /* Opens in read-only mode. */                                                                               

   if (pfile == NULL) {
     printf("could not open file.  Exiting now.\n");
     exit(EXIT_FAILURE);
   }

   if (fgets(pangram, 50, pfile) == NULL) {
     printf("could not read string from  file.  Exiting now.\n");
     exit(EXIT_FAILURE);
   }
   fclose(pfile);
   printf("Now I have string |%s|\n", pangram);  /* Check that you have what you think */

   int string_pos; // "count_char_occur" was a misleading variable name
   int occurrences_found = 0;
   for (string_pos = 0; string_pos < strlen(pangram);string_pos++) { 
     if(pangram[string_pos] == char_to_find) { /* --- Assignment vs. Equality --- */
       printf("The character %c has been found, at position %i. \n", pangram[string_pos], string_pos);
       occurrences_found++;
     }
   }

/* Keep the user in the loop about what happened - reduce assumptions! */
   if (occurrences_found == 0)
     printf("The character %c was not found.\n\n", char_to_find);
   else
     printf("The character %c was found %i times in total.\n\n", char_to_find, occurrences_found);
 }