【问题标题】:read line and read three letters at a time in C在 C 中读取一行并一次读取三个字母
【发布时间】:2012-10-16 07:43:22
【问题描述】:

每次尝试阅读 3 个字母时遇到问题,我想逐行阅读,并在每行中一次按顺序阅读 3 个字母。

当读取该行时发现\n跳转到下一行...

我试试这个

while ((getline(&line, &lenght, file)) != -1){
   while ((strncpy(ch, line, 3)) != NULL) { 

        let = replaceletter(tab, ch);

        if (let != 0)
            printf("%c", let);
   }
}

但它不起作用,只需阅读前 3 个字母,我想要整行。 我真的不知道该怎么做,我需要帮助,请

【问题讨论】:

    标签: c lines letter


    【解决方案1】:

    在您的代码中有几件事本可以做得更好:

    1. 代码不检查读取了多少个字符。是不是队伍太短了?
    2. 目前尚不清楚为什么要检查 strncpy 的返回以查找 NULL。它不返回NULL
    3. 不清楚是否初始化linelenght 以及初始化为什么值。
    4. 不幸的是,很难成为通灵者并猜测replaceletter 是什么、它的作用以及tabch 是如何声明的。
    5. 为什么在while 循环中调用strncpy 是个谜。
    6. 您的程序似乎没有将换行符作为返回字符串的一部分。

    换句话说,如果您想获得或多或少足够的帮助,最好提供一个小型、完整且有效的示例来展示您的问题。

    如果我被分配了那个任务,我可能会这样写:

    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    
    int main(void)
    {
        int  ret     = EXIT_SUCCESS;
        char    *line    = NULL;
        size_t   linecap = 0;
        ssize_t  len;
    
        do {
            len = getline(&line, &linecap, stdin);
            if (len == -1) {
                if (errno != 0) {
                    perror("readline");
                    ret = EXIT_FAILURE;
                }
                break;
            }
            if (len < 4)
                continue; /* Line is too short, try again */
            /* printf("The line is: %s", line); */
            printf("First three letters are: '%.*s'\n", 3, line);
        } while(1);
    
        free(line); /* It is always a good idea to cleanup after yourself */
        return ret;
    }
    

    我希望上面的 sn-p 是不言自明的。但如果有什么需要澄清的,请不要犹豫。

    祝你好运!

    【讨论】:

      【解决方案2】:

      我不明白第二个 while 循环应该如何工作。 strncpy 在这种情况下返回 s1, IE ch。 ch 最好是 char *。

      所以.. ch 怎么会变成 == NULL,除非它一开始就已经是 NULL?如果 ch 开始时为 NULL(未显示它的初始化),那么它已经是一个段错误:)

      如果这条线是有意义的

      while(*(strncpy(ch, line, 3)) != NULL)) {
      

      HTH

      【讨论】:

      • ch 声明为:char *ch;
      • @user1364304:如果你有char *ch;并将一个字符串复制到其中,那么你就有麻烦了。
      • @vlad-lazarenko 在 C 语言中,将字符串复制到的唯一合法的东西是 char *。 man strncpy 告诉我们: ` Name strcpy, strncpy - 复制一个字符串 Synopsis #include char *strcpy(char *dest, const char *src); char *strncpy(char *dest, const char *src, size_t n);`
      • @GreenAsJade:您对合法复制目的地的看法是错误的。但这不是重点。关键是将未初始化的ch 传递给strncpy 是UB。
      • @vlad-lararenko。我同意这是重点。我正在回复您的评论,如果您有一个 char * 并将一个字符串复制到它,那么您就有麻烦了。事实上,您必须有一个 char * 作为字符串副本的目标。正如你所说,你拥有的 char * 也必须被初始化:) 也许你省略了“未初始化”这个词,也许你的意思是“如果你有一个未初始化的 char *”?
      【解决方案3】:

      当您的行长度小于 3 个字符时,您可能会遇到问题。尝试一种更好、更可靠的方法来指定 strncpy 应该复制的字节数,例如在 C 中使用某种 Min 函数实现(更多信息 here)。

      【讨论】:

      • 我要读取的文本文件已经准备好一次读取3个问题是行尾的\n
      猜你喜欢
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      相关资源
      最近更新 更多