【问题标题】:C Segmentation Fault on for loopfor循环上的C分段错误
【发布时间】:2012-09-17 23:01:05
【问题描述】:
int main(int argc, char **argv){

    // If the user does not have the right amount of arguments exit the program and display message
    if(!(argc >= 2)){
        printf("Usage: %s -l -c -w -L <filenames>");
        exit(-1);
    }

    size_t iscFlag = 0;
    size_t islFlag = 0;
    size_t iswFlag = 0;
    size_t isLFlag = 0;
    FILE *src; 
    puts("Work work");  
    // For loop that checks for all the flags
    int i;
    for(i = 1; i < 5; i++){
        if(strcmp(argv[i], "-c") == 0){
            iscFlag = 1;            
        }else if(strcmp(argv[i], "-l") == 0){
            islFlag = 1;
        }else if(strcmp(argv[i], "-w") == 0){
            iswFlag = 1;
        }else if(strcmp(argv[i], "-L") == 0){
            isLFlag = 1;
        }
    }

我正在尝试创建一个简单的 for 循环来检查标志以在 UNIX 类型的终端中重新创建 wc 命令。有人知道for循环是怎么回事吗?我得到一个分段错误。还有更多代码,但我只是发布其中的一部分。

提前致谢。

【问题讨论】:

  • 哦,我是个白痴。我想我在发布后几秒钟就发现了问题所在。我只是在做 ./wc -w 文件名,所以循环正在检查越界。
  • 不要忘记 printf 的参数:你使用没有参数的 %s。下一个可能的段错误

标签: c loops for-loop segmentation-fault fault


【解决方案1】:

有

for(i = 1; i < 5; i++){
    if(strcmp(argv[i], "-c") == 0){

您应该确保argc &gt;= 5 或strcmp 在i == argc 时会收到NULL 指针。

【讨论】:

    【解决方案2】:

    当您的i 一直上升到四个时,您正在查看argv[i],但您只检查argc &gt;= 2。我想当你有三个或四个参数时你会得到一个段错误,只有当你有五个或更多时它才会起作用。

    【讨论】:

      【解决方案3】:
      for(i = 1; i < 5; i++){
              if(strcmp(argv[i], "-c") == 0){
                  iscFlag = 1;
                  continue;           
              }else if(strcmp(argv[i], "-l") == 0){
                  islFlag = 1;
                  continue;
              }else if(strcmp(argv[i], "-w") == 0){
                  iswFlag = 1;
                  continue;
              }else if(strcmp(argv[i], "-L") == 0){
                  isLFlag = 1;
                  continue;
              }
              break;
          }
      

      解决了这个问题!

      【讨论】:

      • 如何解决它?如果你给它几个非标志参数并且没有标志参数,你仍然会得到段错误。
      • @JoãoMendes 实际上他是对的。一旦它找到一个非标志参数,它就会跳出循环。然而,还有一个他没有解决的问题:如果参数是标志,他不会检查他得到的 null,但没有那么多到 i==4
      • @AnalogFile 你的意思是如果参数 不是 标志,他会得到空值,但没有那么多到 i==4,这正是我说过...! :p
      • 不。我的意思是如果参数是标志。如果它找到任何不是标志的参数,则循环立即终止。
      猜你喜欢
      • 2013-08-21
      • 2017-09-13
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      相关资源
      最近更新 更多