2

C のポインターと strcat を使用しようとしています。これは私の学習プロセスの一部です。

アイデアは、ユーザーが数字を含む文字列を入力すると、出力は数字のみを返す必要があるということです。したがって、ユーザーが入力 した場合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 が機能しないのか理解できません。

プログラムが数値を見つけ、そのcharを1つの変数に格納してから、その変数でstrcatを使用しようとする2回目の試行を行いました。コードは次のとおりです。

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;
}

正しい方向に私を向けることができますか?これ以上何ができるのか..

よろしく、

お気に入り

4

4 に答える 4

3

あなたはそれを必要以上に難しくしています。あなたは必要ありませんstrcat

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

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

    pont++;
}
*pont2 = 0;
于 2012-04-02T18:24:03.747 に答える
3

3回目の試行はほぼ正しいです。

交換

strcat(palavra2, palavra[i]);

strncat(palavra2, palavra+i,1);

私は通過palavra+iしていpalavra[i]ますが、前者は進行中のポインターであり、後者は文字であり、strncatポインターが必要です。

これは、文字列と文字を連結する方法を説明するための良い例です。

また、常に変数を初期化するようにしてください

char palavra[SIZE]="";
char palavra2[SIZE]="";
于 2012-04-02T18:24:13.950 に答える
3

あなたのコードの問題: (第 1 バージョン)

1)あなたはそうしますstrcat*pont、ヌル終了文字列ではない単一の文字を参照します。

2) そうしますが*pont++;、*pont は値であり、ポインターではありません。

最初のバージョンに次の変更を加えます。問題ないはずです。

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

*pont2='\0';
于 2012-04-02T18:25:23.750 に答える
1

* (逆参照) を削除し、

        strcat(palavra2, pont);

strcat は a でchar*はないことを想定していますchar が、このバージョンでは残り全体が追加されます。nul で終わる文字列を作成する必要があります。

そして*は役に立たない

    *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;
于 2012-04-02T18:21:46.153 に答える