使用函数返回修改后的字符串

时间:2015-10-29 20:23:26

标签: c string

名词 - 值

取值 -string

C 个字符数

根据输入的数字 N ,重写给定的字符串 s

如果 N > 0,请使用字符 C 并将 N 次附加到 s 的末尾

如果 N < 0,则删除字符串 s 中的每个非字母和非字母字符。

我写了评论以帮助导航。对于N> 0,它会做它应该加上一些奇怪的字符(所以不是)。对于N <0,没有任何事情发生。

&#13;
&#13;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* stinger(char*,char,int);
int main()
{
    char s[20],C;
    int N;
    puts("Enter the string: ");
    gets(s);
    puts("Enter the char: ");
    scanf("%c",&C);
    printf("Number: ");
    scanf("%d",&N);
    //finished inputing the arguments


    printf("%s",stinger(s,C,N));
    /*calling the created function inside main()
    hoping it would return me a string that fulfills the conditions*/
}
char* stinger(char*s,char C,int N){
char T[20],G[20];
int i,k=0;

if (N>0){
    for(i=0;i<N;i++)
        T[i]=C;
    //here I've created a string that should attach to the end
    return strcat(s,T);
}
else if (N<0){
    for(i=0;i<strlen(s);i++){
        if((s[i]>='A'&&s[i]<='Z')||(s[i]>='a'&&s[i]<='z')||(s[i]>='0'&&s[i]<='9')){
            G[k++]=s[i];
        }
        }
    return G;
    }

}
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:3)

您的代码中有两个错误

1)你需要空字符串终止

for(i=0;i<N;i++) T[i]=C;
T[i] = '\0' // you forgot this

for(i=0;i<strlen(s);i++)
   if(isalnum(s[i])) G[k++]=s[i];
G[k]= '\0'; // again, terminate the string with 0

2)第二个错误是,return G ...但是从函数返回后G已经丢失了范围,因为数组G local 到函数stinger 。你可以做的是创建数组以将结果保存在调用函数中,并将其作为指向被调用函数的指针传递。

答案 1 :(得分:1)

  1. G是一个只有stringer函数才能访问的变量,你将它返回到同一个函数。
  2. 得到()

    这很糟糕,因为它可能会溢出输入字符串缓冲区。例如,如果缓冲区大小为2,并且输入16个字符,则将溢出str。

    与fgets()

    这是安全的,因为您可以保证永远不会通过传入缓冲区大小(包括NULL空间)来溢出输入字符串缓冲区。