名词 - 值
取值 -string
C 个字符数
根据输入的数字 N ,重写给定的字符串 s 。
如果 N > 0,请使用字符 C 并将 N 次附加到 s 的末尾
如果 N < 0,则删除字符串 s 中的每个非字母和非字母字符。
我写了评论以帮助导航。对于N> 0,它会做它应该加上一些奇怪的字符(所以不是)。对于N <0,没有任何事情发生。
#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;
答案 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)
G
是一个只有stringer函数才能访问的变量,你将它返回到同一个函数。得到()
这很糟糕,因为它可能会溢出输入字符串缓冲区。例如,如果缓冲区大小为2,并且输入16个字符,则将溢出str。
与fgets()
这是安全的,因为您可以保证永远不会通过传入缓冲区大小(包括NULL空间)来溢出输入字符串缓冲区。