【问题标题】:Wrong string concatenation using strcat使用 strcat 错误的字符串连接
【发布时间】:2015-06-05 13:34:15
【问题描述】:

我正在编写一个程序,它从文件中读取字符串,将它们保存到“字符串缓冲区”,然后连接这些字符串并将它们写入另一个文件。

#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

那么如何得到预期的结果呢?

附:我认为当我使用函数fgets()时会出现问题。

【问题讨论】:

    标签: c arrays string file-io fgets


    【解决方案1】:

    这不是错误或问题,而是预期的行为。请继续阅读。

    fgets() 读取并存储尾随换行符 (\n)。您需要在存储输入之前删除(剥离)它。

    也就是说,请注意:

    1. 当您定义了一个固定大小的缓冲区时,请不要让i 无限增加。可能会溢出。

    2. 确保您的buff[i] 足够大以容纳连接的字符串。否则,它将调用undefined behaviour

    【讨论】:

    • 好的,你能解释一下如何删除尾随换行符吗?
    • 但我没有将连接的字符串保持在行中,我将它保持在 buff[i]
    • @KiberPrestupnik 有很多方法,我更喜欢单线,line[strchr(line, '\n') -1] = 0; 或类似的方式。
    • @KiberPrestupnik 您可以通过以下方式进行操作 size_t n = strlen( line ); if ( n && 行[n-1] == '\n' ) 行[n-1] = '\0';
    • 请注意,建议的line[strchr(line, '\n') -1] = 0; 如果您输入的字符数正好为 17 个或更多,则会导致程序崩溃。使用更安全的方法,比如stackoverflow.com/questions/29875285/…
    【解决方案2】:

    以下代码将为您工作。在执行任何字符串操作之前,您需要添加 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] = '\0';  // 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2011-06-17
      相关资源
      最近更新 更多