C: ходить через массив символов, модифицировать литералы - PullRequest
0 голосов
/ 21 июня 2011

Я новичок в программировании на C, хотя и имел опыт работы с C #. То, что я пытаюсь сделать, это пройти через мой массив символов и заменить «а» на «х» и вывести это на экран. Почему-то это не работает ... вообще;)

Использование gcc 2.2.4 в Debian 6 64bit

#include <stdio.h>
int main()
{
/* A nice long string */
char string[256];
int i;
printf( "Please enter a long string: " );
/* notice stdin being passed in */
fgets ( string, 256, stdin );           

    for( i = 0; i < 256; i++)
    {
            if( string[i] == 'a' )
            {
                    string[i] == 'x';
                    printf("%s", "foo");
            }
    }
  printf( "You entered a very long string, %s", string );
  getchar();
}

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

У вас есть двойной равно

if( string[i] == 'a' )
{
    string[i] == 'x'; /* <-- here */

Сделай так:

if( string[i] == 'a' )
{
    string[i] = 'x';
0 голосов
/ 22 июня 2011

Как минимум один из комментариев гласит: «Компилятор должен предупредить об этом».Я настоятельно рекомендую вам сделать компилятором, предупреждающим вас об этом.:) Позволь мне объяснить.

YMMV для других платформ, но в Unix можно установить для переменной среды CFLAGS включение по умолчанию предупреждений при использовании утилиты make с неявными правилами.

Ниже приведена стенограмма из моего сеанса bash, где я вставляю ваш код в файл, компилирую с make, а затем добавляю оптимизацию в переменную CFLAGS и перекомпилирую, чтобы увидеть, дает ли это больше предупреждений.

503(1)06:22 PM:~ 0> cat >sostr.c
#include <stdio.h>
int main()
{
/* A nice long string */
char string[256];
int i;
printf( "Please enter a long string: " );
/* notice stdin being passed in */
fgets ( string, 256, stdin );

    for( i = 0; i < 256; i++)
    {
            if( string[i] == 'a' )
            {
                    string[i] == 'x';
                    printf("%s", "foo");
            }
    }
  printf( "You entered a very long string, %s", string );
  getchar();
}
504(1)06:22 PM:~ 0> make sostr
cc -g -Wall    sostr.c   -o sostr
sostr.c: In function 'main':
sostr.c:15: warning: statement with no effect
sostr.c:21: warning: control reaches end of non-void function
505(1)06:22 PM:~ 0> export CFLAGS+=' -O2'
506(1)06:23 PM:~ 0> touch sostr.c
507(1)06:23 PM:~ 0> make sostr
cc -g -Wall -O2    sostr.c   -o sostr
sostr.c: In function 'main':
sostr.c:15: warning: statement with no effect
sostr.c:21: warning: control reaches end of non-void function
508(1)06:23 PM:~ 0>

Еще один инструмент для получения большого количества предупреждений - splint;хотя это часто слишком придирчиво.

509(1)06:33 PM:~ 0> splint sostr.c
Splint 3.1.2 --- 23 Aug 2008

sostr.c: (in function main)
sostr.c:9:1: Return value (type char *) ignored: fgets(string, 25...
  Result returned by function call is not used. If this is intended, can cast
  result to (void) to eliminate message. (Use -retvalother to inhibit warning)
sostr.c:15:21: Statement has no effect: string[i] == 'x'
  Statement has no visible effect --- no values are modified. (Use -noeffect to
  inhibit warning)
sostr.c:20:3: Return value (type int) ignored: getchar()
  Result returned by function call is not used. If this is intended, can cast
  result to (void) to eliminate message. (Use -retvalint to inhibit warning)
sostr.c:21:2: Path with no return in function declared to return int
  There is a path through a function declared to return a value on which there
  is no return statement. This means the execution may fall through without
  returning a meaningful result to the caller. (Use -noret to inhibit warning)

Finished checking --- 4 code warnings
510(1)06:34 PM:~ 1>

Так что оба эти метода ловят одну и ту же строку 15 == / = problem.Оба также предупреждают вас, что main должен вернуть 0;если успешно.И splint также жалуется, что вы игнорируете возвращаемые значения из fgets и getchar.Похоже, вы действительно хотите игнорировать результат getchar, поэтому я рекомендую написать (void)getchar();, чтобы показать, что значение намеренно игнорируется.Однако это не относится к fgets.Я предлагаю вам использовать возвращаемое значение или оставить предупреждение (вероятно, для этого игрушечного кода можно игнорировать значение).Проверка возвращаемого значения может быть важной в других программах, поэтому не стоит начинать помечать их (void).

0 голосов
/ 21 июня 2011

Это string[i]='x', а не == 'x'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...