过去几个小时我一直在努力解决这个问题,这是我在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进行编译
我在这段代码中没有使用我创建的包含文件,所以问题不在我的包含中。
答案 0 :(得分:1)
您感兴趣的代码始于:
char* debugString = optarg;
这使得debugString
指针指向optarg
指向的相同位置。这不会以任何方式分配“新”字符串。通过调用strcat(debugString, ...)
,您将覆盖optarg
结束后在内存中出现的任何其他内容。随之而来的是混乱。
要解决此问题,请尝试:
char debugString[1000];
strcpy(debugString, optarg);
这将为您分配1000个字节,以便使用strcat
填充字符串。 你的责任是确保你不要写在debugString
缓冲区的末尾(所以如果你发现连接的字节超过1000个,你必须决定什么你想做那件事。)