Проблема с поиском длины строки в C - PullRequest
1 голос
/ 26 июня 2011

Вот код

#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
  clrscr();
  char a[20],rev[20];
  printf("enter the string");
  scanf("%s",a);
  int len=strlen(a);
  for(int i=0;i<len;i++)
  {
    rev[i]+=a[len-i-1];
  }
  printf("%d \t  \n string is \t %s",len,rev);
  getch();
}

Он работал правильно, когда мы дали ему строку без пробелов:

input: welcome
len: 7
output: emoclew

Когда мы даем ему строку с пробелом:

input: добро пожаловать в этот мир
len: 7
output: некоторые другиеASCII CHARS, что я не видел до сих пор.и "len" снова равно 7

Когда я изменяю следующее утверждение:

scanf ("% s", a) на gets (a);

Я получаю:

вход: добро пожаловать в этот мир
len: 21
вывод: что-то другое.не обратная строка ...

В этом случае «len» правильно, но вывод неправильный.

Что на самом деле происходит?В чем проблема с приведенным выше кодом?

Ответы [ 4 ]

5 голосов
/ 26 июня 2011

scanf не будет читать всю строку. Вместо этого он будет читать до первого пробела ... Вам нужно getline

Кроме того, я заметил, что у вас есть вещи длиной более 19, но вы выделили пространство на 20 символов. Увеличьте это или вы получите UB

3 голосов
/ 26 июня 2011

В дополнение к тому, что сказали другие, не гарантируется, что rev будет инициализирован символами NUL, поэтому ваша строка rev[i]+=a[len-i-1]; может закончиться мусором.

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

Используйте следующее:

scanf ("% [^ \ t \ n]", строка);

1 голос
/ 26 июня 2011

к комментариям:

  1. Как писал Армен Цирунян, вы, вероятно, хотите получить getline
  2. У вас есть только массив символов размером 20 - так что передача большей строки будет происходить при переполнении буфера (что делает вашу программу очень небезопасной - Google для атаки переполнения буфера, если вы хотите узнать больше об этом) - вот почему вам следует убедиться, что вы никогда не читаете больше, чем размер массива символов ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...