strcat()在尝试创建以空格分隔的字符串时删除字符串。 (C编程)

时间:2011-10-08 22:39:54

标签: c string concatenation strcat

过去几个小时我一直在努力解决这个问题,这是我在3年学习编程时遇到的一个陌生问题。

我试图通过连接argv中从stdin找到的字符串来创建一个更长的,空格分隔的字符串。这是我最初写的代码:

#include <stdio.h>
#include <string.h>
#include <getopt.h>

#include "stringtable.h"
#include "strhash.h"
#include "auxlib.h"


int main (int argc, char **argv) {
    int c;
    char* filename;

    while((c = getopt(argc, argv, "@:Dly")) != -1){
        switch(c){
            case '@': 
                printf("@ detected\n");
                char* debugString = optarg;
                int pos_in_input = optind;
                while(argv[pos_in_input][0] != '-' && argv[pos_in_input] != NULL){
                    strcat(debugString, " ");
                    strcat(debugString, argv[pos_in_input]);
                    pos_in_input++;
                    if(argv[pos_in_input] == NULL){break;}                  
                }
                printf("%s\n", debugString);
                break;
            case 'D':
                printf("D detected\n");
                break;
            case 'l':
                printf("l detected\n");
                break;
            case 'y':
                printf("y detected\n");
                break;
            default :
                printf("default detected\n");
        }
    }
}

以上大多数是我未完成的选项处理。感兴趣的代码段位于switch语句中:“@”。 while循环应该通过连接argv中的字符串来创建debugString,当字符串以“ - ”开头时或者到达argv的结尾时停止。我还在字符串之间用“strcat(debugString,”“);”添加空格。它增加了让我麻烦的空间。

如果我连接所有字符串而不以这种方式添加空格:

            while(argv[pos_in_input][0] != '-' && argv[pos_in_input] != NULL){
                strcat(debugString, argv[pos_in_input]);
                pos_in_input++;
                if(argv[pos_in_input] == NULL){break;}                  
            }

我得到以下内容:

 Input: -@what is going on here?
Output: @ detected
        whatisgoingonhere?

这就是我期望它的工作方式。但是,如果我运行添加空格的代码:

            while(argv[pos_in_input][0] != '-' && argv[pos_in_input] != NULL){
                strcat(debugString, " ");
                strcat(debugString, argv[pos_in_input]);
                pos_in_input++;
                if(argv[pos_in_input] == NULL){break;}                  
            }

然后我得到以下输出:

 Input: -@what is going on here?
Output: @ detected
        what  going on here?

注意'what'和'going'之间的两个空格。我的程序仍然正确添加空格,即使由于某种原因,一个单词被删除。我已尝试使用许多不同的输入,它始终是输入中的第二个字符串被删除。有谁知道发生了什么事?

P.S。使用gcc -g -O0 -Wall -Wextra -std = gnu99 -lm进行编译

我在这段代码中没有使用我创建的包含文件,所以问题不在我的包含中。

1 个答案:

答案 0 :(得分:1)

您感兴趣的代码始于:

            char* debugString = optarg;

这使得debugString指针指向optarg指向的相同位置。这不会以任何方式分配“新”字符串。通过调用strcat(debugString, ...),您将覆盖optarg结束后在内存中出现的任何其他内容。随之而来的是混乱。

要解决此问题,请尝试:

            char debugString[1000];
            strcpy(debugString, optarg);

这将为您分配1000个字节,以便使用strcat填充字符串。 你的责任是确保你不要写在debugString缓冲区的末尾(所以如果你发现连接的字节超过1000个,你必须决定什么你想做那件事。)