В чем разница между \ n и \ n в функции strcat? - PullRequest
0 голосов
/ 04 января 2019

извините за мой плохой английский, Я сделал программу, которая читает строки из файла1 и печатает его обратно в файл2 в File1 все строки имеют \ n в конце, кроме последнего. Это не обязательно должен быть снеговик. Если я просто запустил программу без strcat \ n в Последней строке, то выходной файл2 будет показан как нижний. Поэтому я пытаюсь выполнить strcat \ n до последней строки в этом процессе strcat (buffer [9], "\ n"); работал но strcat (буфер [9], '\ n'); не было. Почему это случилось?

// FILE 1
Do you wanna build a snowman?\n
Come on lets go and play\n
I never see you anymore\n
Come out the door\n
It's like you've gone away-\n
We used to be best buddies\n
And now we're not\n
I wish you would tell me why!-\n
Do you wanna build a snowman?\n
It doesn't have to be a snowman.

// FILE 2
It doesn't have to be a snowman.Do you wanna build a snowman?\n
I wish you would tell me why!-\n
And now we're not\n
We used to be best buddies\n
It's like you've gone away-\n
Come out the door\n
I never see you anymore\n
Come on lets go and play\n
Do you wanna build a snowman?\n


include <stdio.h>
include <string.h>
define LINE 50

int main(int argc, char *argv[])
{

    if (argc < 3)
    {
        puts("Usage : hw9 inputFileName OutputFileName");
        exit(1);
    }


    FILE *fp, *fp2;
    fp = fopen(argv[1],"r");
    fp2 = fopen(argv[2], "w");
    char *buffer[15][LINE];
    char *buffer2[15];


    if(fp == NULL || fp2 == NULL)
    {
        printf("File open error! \n");
        return 1;
    };

    int i = 0;
    while (fgets(buffer[i],LINE,fp)!=NULL)
    {
        buffer2[10-i] = buffer[i];
        printf("buffer2[%d] : %s\n", 10-i, buffer2[10-i]);

        i++;
    }

        working!
    strcat(buffer[9], "\n");

        error! why?
    //strcat(buffer[9], '\n');

    fprintf(fp2, buffer2[1]);


    for (int i = 2; i <= 10; ++i)
        fprintf(fp2, buffer2[i]);

    fclose(fp);
    fclose(fp2);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 04 января 2019
char * strcat ( char * destination, const char * source );

принимает параметр const char * точно так же, как "\ n" .. но '\ n' имеет тип char

0 голосов
/ 04 января 2019

В C двойные кавычки используются для представления строковой константы, а одинарные кавычки представляют один символ.

"\n" является строковой константой, содержащей символ \n, за которым следует нулевой байт, заканчивающий строку, и имеет тип const char [], тогда как '\n' является символом \n и имеет тип int (как и все символьные константы).

Функция strcat ожидает const char * в качестве второго аргумента. Строковая константа, такая как "\n", квалифицируется, поскольку массивы (в большинстве случаев) затухают до указателя на первый элемент. Передача '\n' действительно не работает, потому что вы передаете int функции, которая ожидает указатель. Это приводит к тому, что закодированное значение \n рассматривается как указатель, который strcat пытается разыменовать, вызывая неопределенное поведение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...