我有一个使用句子
创建.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);
}
}
}
答案 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}},并省略所有pfile
,fopen
内容。
fclose
并编译并运行:
void read_in_string_stdin (char pangram[]){
printf("please enter the pangram\n");
if (fgets(pangram, 50, stdin) == NULL) {
/* stuff */
}
要从文件中读取,您需要使用fopen
打开文件,使用fscanf
或fgets
阅读,检查返回值,然后关闭文件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);
}