- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我应该编写一个程序来获取文本文件(包含纯文本)并更正以下错误(涉及标点符号):
Hello , there! --> Hello, there!
Hello ,there! --> Hello, there!
A sentence. this should be capitalized --> A sentence. This should be capitalized
我提出的算法如下:我逐行遍历文本文件,并将每一行传递给错误查找器函数。此函数检测上述(第一个和第二个)错误并在错误数组中存储一个 double 。整数部分表示错误开始的位置,小数部分表示发现错误的类型。
例如,如果我将 "Hello , there!"
作为参数传递,则存储在数组中的 double 为 5.1,因为错误从字符串的第 5 个字符开始,而 0.1 是因为这是第一种错误。
类似地,"Hello ,there!"
会将 5.2 存储在数组中(第二种类型的错误)。找到错误后,一段代码将新的更正行写入不同的文件。
FILE *src, *dst; //source file, destination file
int ptr; //shows how many mistakes were found in the line
src = fopen((const char*)filename, "r"); //opening both files
dst = fopen("temp.txt", "w");
char array[1024];
double mistakes[1024];
double mistakeType, position;
int i, j, pos = 0, capitalNeeded = 1; //capitalNeeded shows whether the next letter should be capitalized
while(fgets(array, 1024, src)!=NULL){ //taking the content of the file line by line
puts(array);
ptr = findMistakes(array, mistakes); //the mistakes of the current line are located, and their types are defined
for(i=0; i<ptr; i++){ //looping through the mistakes
if(capitalNeeded && isalpha(array[pos])){
array[pos] = toupper(array[pos]);
capitalNeeded = 0;
}
mistakeType = modf(mistakes[i], &position); //position will be of type int.0000..
for(j=pos; j<position; j++){
if(array[j] == '.' || array[j] == '?' ||array[j] == '!'){ //testing if a capital letter is needed
capitalNeeded = 1;
}
if(capitalNeeded && isalpha(array[j])){
array[j] = toupper(array[j]);
capitalNeeded = 0;
}
}
pos = j+1; //pos becomes the last j+1, basically shows the next character to be read from the array
if(mistakeType == 0.1){ //if mistake was of type 1
//then pos points to a space character ' '. The space is bypassed and the next
//character is placed in the file
fprintf(dst, "%c", array[pos+1]); //which is a punctuation character
fprintf(dst, "%c", array[pos+2]); //then a space is placed
pos += 3; //the next character to be read and placed becomes pos+3
}
else{ //only 2 type of mistakes exist, so if it's not of type 1 then it's of type 2
//In a type 2 mistake the punctuation mark is attached to the next letter
//pos currently points to a space character ' ', and pos+1 to a punctuation mark.
fprintf(dst, "%c", array[pos+1]);
fprintf(dst, "%c", array[pos]);
pos += 2; //the next character to be read and placed becomes pos+2
}
}
fprintf(dst, "%c", '\n'); //the line is changed
pos = 0; //pos is reset, and readied for the processing of the next line
}
但是,我无法判断我的算法是否有效,因为 fputc
将不起作用。编译没有错误,但是新文件是空的。我知道 fputc()
采用 int
参数,所以我尝试使用 fprintf(dst, "%c", array[...]);
,但产生了完全相同的结果。我搜索但找不到答案,感谢任何帮助...
最佳答案
Valgrind 出现错误关于你的代码。
==20508== Use of uninitialised value of size 8
==20508== at 0x4EA7A9E: fgets (iofgets.c:47)
==20508== by 0x400D0E: main (in /home/dac/ClionProjects/replace/a.out)
==20508==
==20508== Invalid read of size 4
==20508== at 0x4EA7A9E: fgets (iofgets.c:47)
==20508== by 0x400D0E: main (in /home/dac/ClionProjects/replace/a.out)
==20508== Address 0x0 is not stack'd, malloc'd or (recently) free'd
我建议你使用字符串替换。我希望这个例子可以帮助你。
temp.txt
Hello , there! Hello ,there! A sentence. this should be capitalized
(我们将把空格作为字符串进行操作,并将其写入文件file.txt)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
// You must free the result if result is non-NULL.
char *str_replace(char *orig, char *rep, char *with) {
char *result; // the return string
char *ins; // the next insert point
char *tmp; // varies
int len_rep; // length of rep
int len_with; // length of with
int len_front; // distance between rep and end of last rep
int count; // number of replacements
if (!orig)
return NULL;
if (!rep)
rep = "";
len_rep = strlen(rep);
if (!with)
with = "";
len_with = strlen(with);
ins = orig;
for (count = 0; tmp = strstr(ins, rep); ++count) {
ins = tmp + len_rep;
}
// first time through the loop, all the variable are set correctly
// from here on,
// tmp points to the end of the result string
// ins points to the next occurrence of rep in orig
// orig points to the remainder of orig after "end of rep"
tmp = result = malloc(strlen(orig) + (len_with - len_rep) * count + 1);
if (!result)
return NULL;
while (count--) {
ins = strstr(orig, rep);
len_front = ins - orig;
tmp = strncpy(tmp, orig, len_front) + len_front;
tmp = strcpy(tmp, with) + len_with;
orig += len_front + len_rep; // move to next "end of rep"
}
strcpy(tmp, orig);
return result;
}
char * Cap(char *string) {
int i;
int x = strlen(string); // You want to get the length of the whole string.
for (i=2;i<x;i++){
if (isalpha(string[i]) && string[i-1] == ' ' && string[i-2] == '.'){
// only first letters of a word.
string[i]= toupper(string[i]);
}
}
return string;
}
void adx_store_data(const char *filepath, const char *data)
{
FILE *fp = fopen(filepath, "ab");
if (fp != NULL)
{
fputs(data, fp);
fclose(fp);
}
}
int main(void)
{
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
// char *s = str_replace("aaabaa", 'b', "ccccc");
// printf("%s\n", s);
// free(s);
fp = fopen("/home/dac/ClionProjects/replace/temp.txt", "r");
if (fp == NULL)
exit(EXIT_FAILURE);
while ((read = getline(&line, &len, fp)) != -1) {
printf("Retrieved line of length %zu :\n", read);
printf("%s\n", line);
str_replace(line, "e", ",");
line = str_replace(line, " ,", ",");
line = str_replace(line, ",", ", ");
line = str_replace(line, " ", " ");
printf("Output: %s", Cap(line));
line = Cap(line);
}
FILE *f = fopen("file.txt", "w");
if (f == NULL)
{
printf("Error opening file!\n");
exit(1);
}
/* print some text */
// const char *text = "Write this to the file";
fprintf(f, "%s\n", line);
fclose(f);
fclose(fp);
if (line)
free(line);
exit(EXIT_SUCCESS);
}
测试它:
Retrieved line of length 67 :
Hello , there! Hello ,there! A sentence. this should be capitalized
Output: Hello, there! Hello, there! A sentence. This should be capitalized
关于c - fputc/fprintf 无法写入我的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37089917/
大多数 fputc 的 C 文件编写示例使用非常基本的示例,很少或没有过程错误检查。 我应该将哪些错误检查技术和函数与 fputc 循环结合使用以确保 fputc 已成功写入文件?我应该如何使用它们?
我在编写的程序中看到了一些我无法真正解释的奇怪行为,我想知道是否有人可以向我解释这里发生的事情。我感觉这是由 g++ 与 -O3 一起使用的一些高级优化技术引起的,但我不确定。 我正在运行类似的东西(
我正在使用 fputc(在 C/C++ 中)将一些数据输出到文件中,文件大小对我的项目很重要。但是结果文件的大小似乎不正确,一个简单的代码示例: FILE *fp = fopen( "123.txt"
由于某种原因,当我尝试使用 fputc 通过管道写入时,我的程序无法工作;但是,当我使用 write 系统调用时它工作正常。这是我使用 fputc 的代码部分: FILE *input = f
我对 C 很陌生,我正在尝试使用 fputc() 在文件中存储整数。当我查看整数格式不同的文件时,该函数起作用。 例如: 1) fputc(ppm1->max, file1); ppm1->max 指
我 3 天前才开始学习 C,我正在尝试编写一个程序,它接收一个文件、读取字符并从中删除所有空格和制表符。我是一名初级程序员,在开始学习 C 之前只学习了一点 MATLAB。我使用的是 Ubuntu 1
#include int main() { FILE *fp; char ch = 'g'; fp = fopen("temp.txt", "r+"); while
我应该编写一个程序来获取文本文件(包含纯文本)并更正以下错误(涉及标点符号): Hello , there! --> Hello, there! Hello ,there! --> Hello, th
给定 unsigned char *str,一个 UTF-8 编码的字符串,用 fputc((char)(*str), file 写入第一个字节(不是字符)是否合法); 最佳答案 移除对 char 的
我有一个用 C 语言编写的小程序,它以一个菜单开始,该菜单在一个带有 do{switch{case 1....}while 循环的函数中实现 当案例 1 验证时,它调用另一个函数,其中 while 循
我有以下 C 函数: int vacateDir(const INODE *pParDirInode) { FILE *fp = fopen("fs560", "rb+"); if (fp =
当使用 fopen("/some/path", "r") 创建流时,我无法找到对 fputc() 指定行为的任何引用>. 我搜索了 C11 Draft n1570 pdf 寻找任何没有运气的引用,fo
我想更改文件的一个值,但以下代码根本不起作用。当我删除 if 语句时它可以正常工作。 代码如下: #include int main() { int b; FILE *fp;
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我正在使用 C 语言编写基本的 fputc 应用程序。我正在编写/附加“.”在文件中使用 for 循环次数。但是,该文件显示的是垃圾字母而不是“。” . #include int main()
我正在尝试使用 fseek 转到文件中的特定位置并打印文本。但是当我使用 fputc 或 fwrite 时,它们会继续输入十六进制值而不是字符值。该文件是 .dat,最初用 0 填充。因此,除此之
getc() 与 fgetc() putc() 与 fputc() 它们之间的主要区别是什么? 我听说除了 getc() 可以用作宏之外,这两个函数的作用几乎相同。这是什么意思? 如果它们相同,为什么
我在使用 fputc 时遇到问题 - 也许有人可以提供帮助。我在开始时分配了一些存储空间,并分配给了 data[0] = 'B' 和 data[1] = 'M' - 数组的其余部分填充了数字。然后数据
int fputc(int c, FILE *stream); int fputs(const char *s, FILE *stream); 为什么在 fputc() 的声明中不需要 const i
我正在用 C 创建一个存档程序,我希望它保存我提供的文件,列出并提取它们。 我有很多问题,因为我使用文本文件进行保存,如果我想处理音乐或照片等二进制文件,这不是最佳选择,因为当我提取它们时,它们没有正
我是一名优秀的程序员,十分优秀!