0

每次尝试阅读 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 个字母,我就想要整行。我真的不知道该怎么做,我需要帮助,请

4

3 回答 3

1

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

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

如果这条线是

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

高温高压

于 2012-10-26T03:16:41.613 回答
0

在您的代码中可以做得更好的事情很少:

  1. 该代码不检查读取了多少个字符。一条线太短了吗?
  2. 目前尚不清楚为什么strncpy要检查NULL. 它不返回NULL
  3. 目前尚不清楚您是否初始化line以及初始化lenght为什么值。
  4. 不幸的是,很难成为通灵者并猜测它是replaceletter什么,它做什么,以及如何tabch被宣布。
  5. 为什么在循环strncpy中调用是一个谜。while
  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;
}

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

祝你好运!

于 2012-10-26T03:27:43.217 回答
0

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

于 2012-10-26T03:11:21.800 回答