我正在尝试使用函数打印给定字符串中每个字符的整数值。当我将字符串传递给此函数时,它会将给定字符串中的每个字符转换为整数,然后将其保存到结果数组中。我还创建了一个指针数组,它将保存每个字符的相应整数的地址。但是当我返回这个指针数组时,我无法正确打印所有整数值。
#include <stdio.h>
int *c2i(char *str);
int main(){
char s[20];
int *p, i;
printf("Enter your string:\n");
scanf("%s", s);
p=c2i(s);
for(i=0; i<4; i++){
printf("\n%d\t%d\n", *p, p);
p++;
}
return 0;
}
int *c2i(char *str){
int i=0, result[20], *ptr[20];
while(*(str+i)!='\0'){
result[i]=*(str+i) & 0xff;
ptr[i]=&result[i];
i++;
}
printf("%d %d %d %d %d %d %d %d", *ptr[0], *ptr[1], *ptr[2], *ptr[3], ptr[0], ptr[1], ptr[2], ptr[3]);
return *ptr;
}
我已经包含了许多 printf
语句,仅用于调试目的。当我尝试运行上面的代码时,程序的输出是:
输入您的字符串:
ABCD
97 98 99 100 6356588 6356592 6356596 6356600
97 6356588
1999382056 6356592
20 6356596
1 6356600
当我在 main()
函数中打印时,我只能正确获取第一个值。当我增加指针并尝试打印下一个值时,我得到垃圾结果。我可以看到地址相同但值已损坏。我在这里做错了什么?
答案 0 :(得分:2)
您无法返回堆栈分配的数组,因为一旦函数调用完成,它就不再被标记为正在使用中。相反,您应该malloc
数组,例如int *ptr = malloc(sizeof(int)*20);
。还记得在完成数组时free
数组(这是一个很好的做法)。有关详细信息,请参阅这些帖子
答案 1 :(得分:2)
这个怎么样
#include <stdio.h>
#include <string.h>
#define MAXLEN 20
void c2i(char *str, int *out, int len);
int main(){
char s[MAXLEN];
int out[MAXLEN];
int *p, i;
printf("Enter your string:\n");
/* fgets safer that scanf,
protects buffer overrun */
fgets(s, sizeof(s), stdin);
/* fgets gives you the newline char though,
so remove it */
if(s[strlen(s)-1] == '\n') {
s[strlen(s)-1] = '\0';
}
c2i(s,out,strlen(s));
for(i=0; i<strlen(s); i++){
printf("%d\n", out[i]);
}
return 0;
}
void c2i(char *str, int *out, int len){
int i=0;
for(i=0; i<len; i++)
{
out[i]=*(str+i) & 0xff;
}
}
将out缓冲区传递给c2i意味着你不需要malloc / free一个缓冲区,但这可能只是一个品味问题。
使用fgets意味着而不是scanf意味着您可以防止缓冲区溢出,并且您的字符串也可以包含空格。
答案 2 :(得分:1)
#include <stdio.h>
int** c2i(char *str) {
int i=0, *result, **ptr;
result = (int *)malloc(20*sizeof(int)) ;
ptr = (int **)malloc(10*sizeof(int *)) ;
while(*(str+i)!='\0'){
result[i]=*(str+i) & 0xff;
ptr[i]=&result[i];
i++;
}
printf("%d %d %d %d %p %p %p %p", *ptr[0], *ptr[1], *ptr[2], *ptr[3], ptr[0], ptr[1], ptr[2], ptr[3]);
return ptr;
}
int main(){
char s[20];
int **p, i;
printf("Enter your string:\n");
scanf("%s", s);
p=c2i(s);
for(i=0; i<4; i++){
printf("\n%d\t%p\n", **p, *p);
p++;
}
return 0;
}