【问题标题】:Why is strcpy() also copying \n? Can I get rid of it?为什么 strcpy() 也复制 \n?我可以摆脱它吗?
【发布时间】:2012-07-29 10:36:56
【问题描述】:

我调试了一个函数,它正在工作。所以,是的,自学 C 似乎进展顺利。但我想让它变得更好。也就是说,它读取的文件是这样的:

want 
to 
program
better

并将每一行单独的字符串放入一个字符串数组中。然而,当我把东西打印出来时,事情变得很奇怪。据我所知, strcpy() 应该只复制一个字符串,直到 \0 字符。如果这是真的,为什么下面要打印字符串 want 和 \n?就像 strcpy() 也复制了 \n 并且它挂在那里。我想摆脱它。

我复制文件的代码如下。我没有包括整个程序,因为我认为这与正在发生的事情无关。我知道问题出在这里。

void readFile(char *array[5049]) 
{
    char line[256]; //This is to to grab each string in the file and put it in a line. 
    int z = 0; //Indice for the array

    FILE *file;
    file = fopen("words.txt","r");

    //Check to make sure file can open 
    if(file == NULL)
    {
        printf("Error: File does not open.");
        exit(1);
    }
    //Otherwise, read file into array  
    else
    {
        while(!feof(file))//The file will loop until end of file
        {
           if((fgets(line,256,file))!= NULL)//If the line isn't empty
           {
             array[z] = malloc(strlen(line) + 1);
             strcpy(array[z],line);
             z++;
           }    
        }
    }
    fclose(file);
}

所以现在,当我执行以下操作时:

     int randomNum = rand() % 5049 + 1;

     char *ranWord = words[randomNum];
     int size = strlen(ranWord) - 1; 
     printf("%s",ranWord);
     printf("%d\n",size);
     int i; 
     for(i = 0; i < size; i++)
     {
          printf("%c\n", ranWord[i]);
     }

打印出来:

these 
6
t
h
e
s
e

不应该打印出以下内容吗?

 these6
 t
 h
 e
 s
 e

所以我唯一能想到的是,当我将字符串放入数组时,它也会将 \n 放入其中。我怎样才能摆脱它?

一如既往,尊重。 极客欧米茄

【问题讨论】:

  • \n == \0,如果不是,则复制。简单的。如果您想避免这种情况,请编写您自己的strcpy()。或者,如果换行符总是在末尾,则操作 '\0' 字符位置。
  • 不要使用 feof();如果您不需要区分错误和EOF,则不需要它。放入 fgets() 循环就足够了,而且简单得多。
  • 我认为这已关闭。感谢大家的回答。

标签: c arrays printf strcpy


【解决方案1】:

fgets 也会读取\n,它是您输入文件的一部分。如果您想摆脱它,请执行以下操作:

int len = strlen(line);
if (len > 0 && line[len-1] == '\n') line[len-1] = '\0';

【讨论】:

  • 更好:if (len &gt; 0 &amp;&amp; line[len-1] == '\n') line[--len] = '\0';
  • 谢谢你们俩。这确实解决了问题。 fgets() 是一个非常糟糕的方法吗?我可以避免这样的事情吗?我改用 fread() 了吗?
  • fread 具有相同的行为。您可以通过使用 C 以外的语言来避免此问题,该语言具有更高级的字符串/io 处理内置(python、Java、...)。
  • 我不知道其他人的意见,但 fread() 听起来更糟糕;必须一次读取一个字节然后进行转换,这比读取一行并简单地删除尾随换行符要繁琐且容易出错。您必须以某种方式处理换行符,所以它最好尽可能干净。
  • 谢谢大家。正如我所说,我正在学习。有人告诉我 fread() 更好,但我个人更喜欢 fgets()。感谢大家的帮助。
【解决方案2】:

例如,当您阅读第一行时,您实际阅读的是“want\n”,因为换行符是该行的一部分。所以你得到“想要\n\0”。其他行也是如此(最后一行除外,除非您的文件末尾有空行)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2019-01-12
    相关资源
    最近更新 更多