2014-02-10 49 views
1

我目前正在嘗試編寫我的CS實驗室,並得到我看不到的分段錯誤。我是在做一些愚蠢的事情還是什麼?代碼應該使用命令行參數(「blah.exe hello world」)並輸出它們周圍的橫幅。我們班沒有先前的C語言知識,但是之前的數據結構課程。從argc C分段錯誤

實施例輸出

=============== 
= hello world = 
=============== 

來源:用gcc -std = C99 -Wall bannerize.c

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

int main(int argc, char* argv[]) { 
     if(argc <= 1) { 
       return EXIT_FAILURE; 
     } 

     printf("TEST"); 
     int row_length = argc + 3; //3 for space after last word and 2 extra border chars 
     for(int i = 1; i < argc; i++, row_length += strlen(argv[i])); 

     printf("TEST2"); 
     char c; 
     while((c=getchar())!=EOF) { 
      printf("TEST3"); 
      for(int i = 1; i < argc; i++, printf("%c", c)); 
      printf("\n"); 

      printf("%c ", c); 
      for(int i = 1; i < argc; i++, printf("%s ", argv[i])); 
      printf("%c\n", c); 

      for(int i = 1; i < argc; i++, printf("%c", c)); 
      printf("\n"); 
    } 

    return EXIT_SUCCESS; 
} 

工作正常編譯爲根本不帶參數運行,但添加任何命令行參數是在打印任何內容之前給出分段錯誤。

+4

_在打印任何東西之前發生分段錯誤._ - 由於您的打印語句未刷新其輸出,您不知道這是真的。在每個末尾添加'\ n',例如'printf(「TEST \ n」);'以獲得更好的信息。或者,通過'fflush(stdout);'手動刷新輸出。 – mah

+1

你至少要聲明'c'是'int'。除了'getchar'返回'int'外,'EOF'不會(通常)適合'char',所以'while'不會結束。 – Kninnug

回答

5
for(int i = 1; i < argc; i++, printf("%s ", argv[i])) 

這是寫一個for一個奇怪的和扭曲的方式。考慮一下i == argc - 1會發生什麼。你增加它,然後你訪問argv[argc]。其中必然是NULL。

,而不是寫在了這個神祕的(!ZING)的方式,嘗試用一個實際的身體:

for(int i = 1; i < argc; i++) { 
    printf("%s ", argv[i]); 
} 

美中不足的是,只有當條件(i > argc)持有主體中執行。

+1

注意,在for(int i = 1; i Nabla

+0

我在另一篇文章中看到了這個循環,並且總是喜歡這一行。我沒有意識到i ++會和print語句一起執行,我認爲,只是表示body從這裏開始,但我認爲它與i ++一起運行,對嗎? – CrypticStorm

+0

@CrypticStorm它是「逗號運算符」,你很少需要它。 – cnicutar