使用 strcat 的错误字符串连接
Wrong string concatenation using strcat
我正在编写一个程序,从文件中读取字符串,将它们保存到 'string buffer',然后连接这些字符串并将它们写入另一个文件。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <stdio.h>
int main() {
FILE *f = fopen("Read.txt", "r");
char line[20];
char buff[15][20];
int i = 0;
while (fgets(line, 18, f)) {
strcpy(buff[i], line);
i++;
}
FILE *h = fopen("Out.txt", "w+");
for (int j = 0; j < i; ++j) {
char ct[4] = "smt";
strcat(buff[j], ct);
fputs(buff[j], h);
}
return 0;
}
文件内容 Read.txt:
Lorem ipsum
dolor sit
amet
预期输出(文件 Out.txt):
Lorem ipsumsmt
dolor sitsmt
ametsmt
但我在 Out.txt 中得到的是:
Lorem ipsum
smtdolor sit
smtamet
smt
那么如何得到预期的结果呢?
P.S。我认为问题发生在我使用函数 fgets()
.
时
这不是错误或问题,而是预期的行为。请继续阅读。
fgets()
读取并存储结尾的换行符 (\n
)。您需要在存储输入之前删除(剥离)它。
话虽如此,请注意:
当您定义了固定大小的缓冲区时,请不要允许 i
的无限增量。可能会溢出。
确保您的 buff[i]
足够大以容纳连接的字符串。否则,它将调用 undefined behaviour.
以下代码适合您。在进行任何字符串操作之前,您需要添加 Null Character。我在修改的地方注释了代码。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <stdio.h>
int main() {
FILE *f = fopen("Amol.txt", "r");
char line[20];
char buff[15][20];
int i = 0;
while (fgets(line, 18, f)) {
line[strlen(line) -1] = '[=10=]'; // Here I added NULL character
strcpy(buff[i], line);
i++;
}
FILE *h = fopen("Out.txt", "w+");
for (int j = 0; j < i; ++j) {
char ct[5] = "smt\n"; // As \n will be at the end,so changed this array
strcat(buff[j], ct);
fputs(buff[j], h);
}
return 0;
}
我正在编写一个程序,从文件中读取字符串,将它们保存到 'string buffer',然后连接这些字符串并将它们写入另一个文件。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <stdio.h>
int main() {
FILE *f = fopen("Read.txt", "r");
char line[20];
char buff[15][20];
int i = 0;
while (fgets(line, 18, f)) {
strcpy(buff[i], line);
i++;
}
FILE *h = fopen("Out.txt", "w+");
for (int j = 0; j < i; ++j) {
char ct[4] = "smt";
strcat(buff[j], ct);
fputs(buff[j], h);
}
return 0;
}
文件内容 Read.txt:
Lorem ipsum
dolor sit
amet
预期输出(文件 Out.txt):
Lorem ipsumsmt
dolor sitsmt
ametsmt
但我在 Out.txt 中得到的是:
Lorem ipsum
smtdolor sit
smtamet
smt
那么如何得到预期的结果呢?
P.S。我认为问题发生在我使用函数 fgets()
.
这不是错误或问题,而是预期的行为。请继续阅读。
fgets()
读取并存储结尾的换行符 (\n
)。您需要在存储输入之前删除(剥离)它。
话虽如此,请注意:
当您定义了固定大小的缓冲区时,请不要允许
i
的无限增量。可能会溢出。确保您的
buff[i]
足够大以容纳连接的字符串。否则,它将调用 undefined behaviour.
以下代码适合您。在进行任何字符串操作之前,您需要添加 Null Character。我在修改的地方注释了代码。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <stdio.h>
int main() {
FILE *f = fopen("Amol.txt", "r");
char line[20];
char buff[15][20];
int i = 0;
while (fgets(line, 18, f)) {
line[strlen(line) -1] = '[=10=]'; // Here I added NULL character
strcpy(buff[i], line);
i++;
}
FILE *h = fopen("Out.txt", "w+");
for (int j = 0; j < i; ++j) {
char ct[5] = "smt\n"; // As \n will be at the end,so changed this array
strcat(buff[j], ct);
fputs(buff[j], h);
}
return 0;
}