2012-06-08 77 views
0

我在尝试计算为什么我的g ++编译程序在strncat()调用中发生故障时出现问题。为什么程序调用strncat()会产生分段错误?

我一直在跳过这个网站和一般谷歌搜索,发现了一些类似的问题,但没有找到任何解决方案,为我工作。这是一个更大的代码的一部分,只有很多我可以做的重新定义变量,因为代码不是我的。

代码的所有这些部分是为了做一个文件的最后一行被读取,删除相关数据并连接到一个char *

当我运行它,我在得到一个分段错误与strncat(RAM,nextchar,1)

char line[256]={"0"}; 
char nextchar[10]={"0"}; 
int length=0; 
double rac; 
double decc; 
bool SPACE=false; 
char * RAM="RA: "; 
char * DECM="DEC: "; 
if(AutoColData.good()){ 
    while(!AutoColData.eof()) AutoColData.getline(line,256); 
    for(int i=0;i<strlen(line);i++){ 
     nextchar[0]=line[i]; 
     cout<<line[i]; 
     if(isspace(nextchar[0])&& !SPACE) SPACE=!SPACE; 
     else if(SPACE && !isspace(nextchar[0])){ 
      SPACE=!SPACE; 
      length++; 
     } 
     if(length==6) { 
      cout<<"\n"<<RAM<<nextchar<<"\n"; 
      strncat(RAM,nextchar,1); 
     } 
     else if(length==7) strcat(DECM,nextchar); 
    } 
} 

有一些草率的选择,在这里,我知道(整个“SPACE”的事情是杂乱)线。但我认为没有任何理由对Seg Fault产生影响。它运行良好,直到与strncat()的行。该cout工作正常,两个字符串打印并在他们有正确的数据,但然后strncat失败。我试过使用malloc(),字符串,似乎没有任何工作。如果任何人都可以指出我正在做什么愚蠢的事情,这将是非常有益的。谢谢。

+4

好第一问题在于你试图修改字符串文字,即使尽管没有为你添加的额外字符预留空间。任何指向文字的字符指针都应该是'const char *'。也许你得到了这个警告,或者你的警告级别太低了,但GCC吐出'警告:从字符串常量到'char *'[-Wwrite-strings]'的弃用转换。 – chris

+3

当你解决第一个问题时,while(!AutoColData.eof())'循环会产生另一个问题:http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a -loop-condition-considered-wrong – Flexo

+4

如果这是真正的C++,那么使用'std :: string'会很容易得到正确的结果。否则,在尝试在末尾粘贴某些内容之前,请将'“RA:”'复制到足够大的缓冲区中。 –

回答

7

RAM被错误地宣布为char *,当它真正应该是一个const char *:字符串文字只读,你不准写信给他们。您的strncat调用只是未定义的行为。

如果你想有一个可写的字符串,你可以做一个足够大的字符数组:char RAM[100] = "RA: ";(这将在后面的零填充),甚至更好,只需使用std::string

std::string RAM = "RA: "; 
RAM += nextchar; 
相关问题