0

このエラーが何度も発生し、プログラムにどのように適用されるかわかりません。これが私のプログラムです。

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

int nextword(char *str);



void main(void)
{
  char *str = "Hello! Today is a beautiful day!!\t\n";
  int i = nextword(str);
  while(i != -1)
    {
      printf("%s\n",&(str[i]));
      i = nextword(NULL);
    }
}

int nextword(char *str)
{
  // create two static variables - these stay around across calls
  static char *s;
  static int nextindex;
  int thisindex;
  // reset the static variables
  if (str != NULL)
    {
      s = str;
      thisindex = 0;
      // TODO:  advance this index past any leading spaces
      while (s[thisindex]=='\n' || s[thisindex]=='\t' || s[thisindex]==' '                )
    thisindex++;  

    }
  else
    {
      // set the return value to be the nextindex
      thisindex = nextindex;
    }
  // if we aren't done with the string...
  if (thisindex != -1)
    {
      nextindex = thisindex;
      // TODO: two things
      // 1: place a '\0' after the current word
      // 2: advance nextindex to the beginning
      // of the next word
      while (s[nextindex] != ' ' || s[nextindex] != '\n' || s[nextindex] != '\t')
    {
      if ( s[nextindex] == '\0')
        return -1;
      else
        {
          nextindex++;
          if (s[nextindex]==' '||s[nextindex]=='\n'||s[nextindex]=='\t')
        str[nextindex]='\0';
        }
    }

    }
  return thisindex;
}

私のプログラムは、コンソールへの出力を持っているはずです

Hello!
Today
is 
a
beautiful 
day!!
4

3 に答える 3

5

Stringliteralを変更しようとしています。これにより、segfault などの未定義の動作が発生します。

str[nextindex]='\0'

ここで、strは のパラメータですnextWord()。これは次のとおりです。

char *str = "Hello! Today is a beautiful day!!\t\n";
int i = nextword(str);

は文字列リテラルであるため"Hello! Today is a beautiful day!!\t\n"、それを変更することは洗練された動作であり、あなたの場合(幸いなことに)セグフォールトが発生しました。

于 2012-10-02T06:46:46.790 に答える
4

すべての警告とデバッグ情報を有効にしてコンパイルする必要があります ( Linux などでGCCgcc -Wall -gを使用している場合は、 でコンパイルすることを意味します)。

次に、デバッガー ( gdbLinux など) の使用方法と、場合によってはvalgrindのようなリーク検出器の使用方法を学ぶ必要があります。

NULL ポインタや初期化されていないポインタなど、「不適切な」ポインタを逆参照すると、セグメンテーション違反が発生する可能性があります。また、読み取り専用セグメントに書き込む場合にも発生する可能性があります (おそらく、読み取り専用のセグメントに配置された文字列リテラルを上書きしている可能性があり.textます.rodata) 。

コンパイラーのすべての警告を考慮に入れ (およびそれらを有効にして)、デバッガーを使用することは、C プログラマーにとって不可欠なスキルです。

于 2012-10-02T06:45:21.323 に答える
0

nextindex初期値を教えてください

于 2012-10-02T06:49:13.180 に答える