C语言 用sprintf时下标越界

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 用sprintf时下标越界相关的知识,希望对你有一定的参考价值。

char *log_sql;
sprintf(log_sql, "%s", "aaaabbbb");
总是报下标越界,我知道是log_sql越界了。
换成char log_sql[1000];就好了。
指针字符串和字符数组到底有什么区别啊?求解?

sprintf(log_sql, "%s", "aaaabbbb");是将输出的字符串"aaaabbbb"拷贝到log_sql所指的内存地址空间。当您使用char *log_sql;定义log_sql时,log_sql所指的内存地址空间是未知的,可能会指向系统或其他软件正在使用的内纯空间,因此会越界。
而当您换成char log_sql[1000];后,log_sql所指的内存地址空间是一块已知的1000字节的空闲内存空间。所以不会出错。
参考技术A char* log_sql只是定义了一个char指针,并没有分配任何的地址空间;而且这个指针还没初始化。。。它指向一个任意地址;所以用sprintf进行字符串格式化时,向log_sql指向的地址空间赋值时就会造成越界了(log_sql指向的是一个未知的地址,可能连页面都没提交呢)

换成char log_sql[1000]后,log_sql指向了数组的首地址,赋值当然没什么问题了;
参考技术B char *log_sql;
//上面定义的是指向字符串的指针,其值是内存地址,执行时为这个变量分配4个字节。
char log_sql[1000];
//上面定义的是字符数组,其值是字符的ASCII码值,执行时为这个变量分配1000个字节。
参考技术C 只要分配了相同大小的空间,就没区别。你那个char *log_sql;只是指针,你还没有对他分配空间的说,不要忘记new操作符。 参考技术D 本函数与printf()基本一致,但输出结果写入字符串中
例:将"test 1 2"写入数组s中

#include<stdio.h>
int main(void)

char s[40];

sprintf(s,"%s%d%c","test",1,'2');
/*第一个参数就是指向要写入的那个字符串的指针,剩下的就和printf()一样了

你可以比较一下,这是向屏幕输入
printf("%s%d%c","test",1,'2');

*/
return 0;

C语言将数字转换为字符型输出(用函数)

对聪明点的人都应该挺简单,我就是想不通调用函数的时候是整型,返回函数的时候需要返回字符数组,需要怎么做?谢谢……尽量不要用指针,我们老师没讲过,我自学指针不咋滴啊

可以使用sprintf函数实现功能。
sprintf的声明为
int sprintf(char *dst, const char * format_str...);
其功能为:将...部分的参数,按照format_str的要求,输入到dst中。
需要根据数字的类型,使用format_str。
如整型(int)的使用方式为
sprintf(buf, "%d", a);
如果a为123,那么buf中的字符串为"123"。
常见的数字类型还有:
1 short, 用%h输出;
2 long, 用%ld输出;
3 float, 用%f输出;
4 double, 用%lf输出。
参考技术A 给,已经编译运行确认:
#include<conio.h>
#include<stdio.h>

char s[20]=NULL;//用以存放字符型输出结果的字符数组

void inttostring(int n)//转换用的函数

int i=0,j;
char temp;

while(n)//先将整数逆序保存进数组

s[i]=n%10+'0';//将十进制数字转换成字符保存
n=n/10;
i++;


for(j=i-1;j>=i/2;j--)//再将逆序的字符结果再逆转一次,得到正确结果

temp=s[j];
s[j]=s[i-j-1];
s[i-j-1]=temp;



int main()

int i;

printf("please input a number: ");
scanf("%d",&i);

inttostring(i);

printf("String is: %s",s);

getch();
return 0;
本回答被提问者采纳
参考技术B 最简单的方法就是用sprintf函数,直接把整型变量输出到一个字符串中(当然就可以用字符数组),复杂一点就是LS说的那样把一个整数每一位取出,放到字符数组中,代码我就不写了,参考LS的。

简单示例sprintf函数:

#include <stdio.h>
#include <stdlib.h>

int main(void)

char str[10];
int i = 12345;

sprintf(str,"%d",i);
printf("str = %s\n",str);

return 0;
参考技术C 你是自学的?那就自己动手试一下吧,我也是自学吧。不过是因为自己进度比老师快罢了。
我说个思路吧,就不给你学程序段了。最简单的方法就是“打散输出”,比如135这个整数,你可以把它的百位、十位、各位分别取出,用字符数组存放,再用for循环输出。
你先动手自己试一下,我的经验就是自己动手永远比老师告诉你现成的程序强!
参考技术D 不用指针怎么行呢?
下面这个程序供参考

#include "stdio.h"
#include "stdlib.h"

void main()

int b;
char str[10];
printf("Please input an int:\n");
scanf("%d",&b);
itoa(b,str,10);///这个函数为stdlib.h库中的库函数
printf("%s",str);

以上是关于C语言 用sprintf时下标越界的主要内容,如果未能解决你的问题,请参考以下文章

在android中,数据下标越界,则发生啥异常

数组访问越界

数组访问越界

数组访问越界

数组访问越界

数组越界会发生什么