Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在字符串中更改字母_C_String_Main - Fatal编程技术网

C 在字符串中更改字母

C 在字符串中更改字母,c,string,main,C,String,Main,我正在做一个项目,把字母“e”改成“a”,但我还是没有把它改对。我的输入是一个文件abc.txt: " " 我的输出是我妈妈是alycie Lou,在另一行中我妈妈是Alicia Lou。 这是我的密码。有人能帮我吗 " " 看 不!这不会存储文件中的所有字符串。这将读取文件中的所有字符串,使最后一个读取的字符串保持一致。在您的情况下,当循环结束时,忽略while中的错误!feof,第行将具有文件中的最后一行 } fclose(arch); for ( i=0; lin

我正在做一个项目,把字母“e”改成“a”,但我还是没有把它改对。我的输入是一个文件abc.txt: "

" 我的输出是我妈妈是alycie Lou,在另一行中我妈妈是Alicia Lou。 这是我的密码。有人能帮我吗

"

"

不!这不会存储文件中的所有字符串。这将读取文件中的所有字符串,使最后一个读取的字符串保持一致。在您的情况下,当循环结束时,忽略while中的错误!feof,第行将具有文件中的最后一行

    }
    fclose(arch);

    for ( i=0; line[i]; ++i )
    {
        if ( line[i] == 'e' )
        {
            line[i] = 'a';
            printf("%s", line);
你想打印行的次数与e的打印次数相同吗?如果您只想在所有“e”都转换后打印一次,请将printf行移动到for循环结束后


玩得开心的几个建议 首先更改行声明,并声明一个不是i的计数器。我们将同时使用i和计数器:

字符行[最大字符串大小]; int计数器=0; 然后我会对读取文件的while循环执行此操作。请注意,如果计数器曾经等于或超过MAX_线,则循环将退出:

而fgetsline,最大字符串大小,拱门!=空和计数器<最大值线(&U) { 对于i=0;行[i];++i { 如果行[i]=“e” { 行[i]=“a”; } } printf%s,第行; 计数器++; } 试试这些,看看它是否产生了想要的行为


希望有帮助

当你想处理整个文件的内容时,将所有的“e”改为“a”,删除所有出现的单词very。。。您应该考虑的第一件事是:我将逐行读取文件,处理每一行,直到没有更多的行。这一思想最直接的实现方式是

char line[MAX_LINE_LENGTH];
// use FILE *f = fopen(filename, "r"); instead of stdin
while (fgets(line, sizeof line, stdin)) {
    process(line);
}
// remember to fclose(f) if not using stdin
记住这4或6行;你会经常使用它们

在您的特定情况下,您希望打印带有“a”而不是“e”的行,流程函数可能类似于:

void process(const char *line) {
    for (int i = 0; i < strlen(line); i++) {
        if (line[i] == 'e') putchar('a');
        else putchar(line[i]);
    }
}
就这样。你的大部分程序都完成了


添加正确的includes、error checking、main并结束。

您正在将所有行读取到同一个缓冲区中,每次读取新行时,只会覆盖上一行的最后一行。试着在阅读完while循环的每一行之后,而不是在末尾处理它。另外,for循环没有意义。。。您正在迭代字符串中的字符以进行替换,但每次替换字符时都会打印字符串,而不是在所有替换完成后仅打印一次。感谢您的触摸!但是如果我做一些类似的事情:fgetsline[I],50,arch和I++来存储所有字符串;这也是错误的,对吗?是的,那是错误的。您需要一个数组数组一个字符串数组,如字符行[MAX_line][MAX_LENGTH];然后你可以读入循环中的第[i]行并更新i++,我修改了上面的代码,现在它只读取第一行。你能告诉我怎么了吗@Mungo您没有在阅读后立即处理该行。为了保留PMG的答案,我在下面列出了我自己的答案。永远不要使用feof,而是检查fgets是否返回空值,它是否有效!非常感谢你!你们帮了我很多。我在这方面是新手,我的教授告诉我不要使用我们在课堂上还没有见过的函数。这就是为什么我用“feof”,因为他只教我读文件。但是你说的方式允许我使用,我没有想到。再次非常感谢你。
    }
    else{
        while (!feof(arch)){
            fgets(line, 50 , arch);
            //store all strings from the file
        }
    }
    fclose(arch);

    for ( i=0; line[i]; ++i )
    {
        if ( line[i] == 'e' )
        {
            line[i] = 'a';
            printf("%s", line);
        }
    }

    return 0;
}
char line[MAX_LINE_LENGTH];
// use FILE *f = fopen(filename, "r"); instead of stdin
while (fgets(line, sizeof line, stdin)) {
    process(line);
}
// remember to fclose(f) if not using stdin
void process(const char *line) {
    for (int i = 0; i < strlen(line); i++) {
        if (line[i] == 'e') putchar('a');
        else putchar(line[i]);
    }
}