c strcat с указателем - PullRequest
       54

c strcat с указателем

2 голосов
/ 02 апреля 2012

Я пытаюсь использовать указатели и strcat из C. Это часть моего учебного процесса.

Идея состоит в том, что пользователь вводит строку, содержащую цифры, и вывод должен возвращать только цифры. Итак, если пользователь вводит te12abc вывод должен быть 12.

Это моя первая попытка:

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

#define SIZE 10

int main()
{
    char palavra[SIZE];
    char palavra2[SIZE];
    char *pont = palavra;
    char *pont2 = palavra2;

    printf("Insert the string\n");
    scanf("%s", palavra);

    do{
        if (isdigit(*pont)){
            strcat(palavra2, *pont);
        }
        *pont++;
    }while (*pont != '\0');

    printf("\nThe number is:\n%s\n", palavra2);
    return 0;
}

Я считаю, что указатель работает должным образом, но не могу понять, почему не работает strcat.

Сделал вторую попытку: программа находит число, сохраняет этот символ в одной переменной и только затем пытается использовать strcat с этой переменной. Вот код:

int main()
{
    char palavra[SIZE];
    char palavra2[SIZE];
    char temp;
    char *pont = palavra;
    char * pont2 = &temp;

    printf("Insert the string\n");
    scanf("%s", palavra);

    do{
        if (isdigit(*pont)){
            temp = *pont;
            strcat(palavra2, pont2);
        }
        *pont++;
    }while (*pont != '\0');

    printf("\nThe number is:\n%s\n", palavra2);
    return 0;
}

Еще раз это вызывает у меня проблемы в strcat.

Сделал одну последнюю попытку, но без указателя и все еще strcat не работает. Вот код:

int main()
{
    int i = 0;
    char palavra[SIZE];
    char palavra2[SIZE];
    char temp;

    printf("Insert the string\n");
    scanf("%s", palavra);

    do{
        if (isdigit(palavra[i])){
            temp = palavra[i];
            strcat(palavra2, palavra[i]);
        }
        i++;
    }while (palavra[i] != '\0');

    printf("\nThe number is:\n%s\n", palavra2);
    return 0;
}

Можете ли вы указать мне правильное направление? Не теперь, что еще я могу сделать ..

С уважением,

favolas

Ответы [ 4 ]

3 голосов
/ 02 апреля 2012

Проблемы с вашим кодом: (1-я версия)

1) Вы делаете strcat, но *pont относится к одному символу, который не является строкой с нулевым символом в конце.

2) Вы делаете *pont++; Но * pont - это значение, а не указатель.

Сделайте это изменение для 1-й версии: все должно быть в порядке.

 do{
        if (isdigit(*pont)){
            *pont2=*pont;
             pont2++;
        }
        pont++; 
    }while (*pont != '\0');

*pont2='\0';
3 голосов
/ 02 апреля 2012

Ты делаешь это сложнее, чем должно быть. Вам не нужно strcat:

/* Untested. */   
char *pont = palavra;
char *pont2 = palavra2;

while (*pont) {
    if (isdigit(*pont))
        *pont2++ = *pont;

    pont++;
}
*pont2 = 0;
3 голосов
/ 02 апреля 2012

Ваша третья попытка почти верна.

Заменить

strcat(palavra2, palavra[i]);

с

strncat(palavra2, palavra+i,1);

Я передаю palavra+i, а не palavra[i], потому что первый - прогрессивный указатель, а последний - символ, а strncat нужны указатели

Это хороший пример, чтобы проиллюстрировать , как объединить строку и символ

Кроме того, убедитесь, что вы всегда инициализируете свои переменные

char palavra[SIZE]="";
char palavra2[SIZE]="";
1 голос
/ 02 апреля 2012

Удалить * (разыменование),

        strcat(palavra2, pont);

strcat ожидает char*, а не char, но эта версия добавляет все остальное.Вы должны создать строку с нулевым символом в конце.

И * бесполезен

    *pont++;

Это делает работу

    pont++;

теперь все сразу

int main()
{
  char palavra[SIZE];
  char palavra2[SIZE];
  char c2[2] = "a";
  char *pont = palavra;
  char *pont2 = palavra2;

  printf("Insert the string\n");
  scanf("%s", palavra);

  do{
    if (isdigit(*pont)){
      c2[0] = *pont;
      strcat(palavra2, c2);
    }
    pont++;
}while (*pont != '\0');

printf("\nThe number is:\n%s\n", palavra2);
return 0;

Однако это слишком сложно

int main()
{
  char palavra[SIZE];
  char palavra2[SIZE];


  printf("Insert the string\n");
  scanf("%s", palavra);

  char *pont = palavra;
  char *pont2 = palavra2;

  while (true) {
    char c = *pont ++;
    if (c == 0) break;
    if (isdigit(c)){
       *pont2++ = c;
    }
  };
  printf("\nThe number is:\n%s\n", palavra2);
  return 0;
...