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 不工作。

第二次尝试是程序找到一个数字,将该字符存储在一个变量中,然后才尝试将 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;
}

你能指出我正确的方向吗?不要现在我还能做什么..

问候,

收藏夹

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

您的第三次尝试几乎是正确的。

代替

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)您这样做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*not achar 但此版本附加了整个其余部分。您必须创建一个以 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 回答