小编Kei*_*ler的帖子

有没有办法让我的函数返回一个动态数组?

所以目前我有一个函数我返回一个静态数组,有没有办法让它返回一个动态数组为了效率?

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

int *charpos(char *str, char ch)
{
    int *bff, bc, ec, i, strln;
    static int ret[255];
    bc = 0;
    ec = 0;

    for(i = 0; str[i] != '\0'; i++)
        ;

    strln = i;
    for(i = 0; i <= strln; i++)
    {
        if(str[i] == ch)
            ec++;
    }

    bff = malloc(sizeof(int)*ec);
    if(sizeof(bff) > sizeof(ret))
    {
        free(bff);
        return 0;
    }

    for(i = 0; i <= 255; i++) ret[i] = '\0';
    for(i = 0; i <= strln; i++) …
Run Code Online (Sandbox Code Playgroud)

c arrays return function dynamic

7
推荐指数
1
解决办法
4919
查看次数

scanf动态分配

无论出于何种原因,以下代码打印(null):

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

int main(void)
{
    char *foo; 
    scanf("%ms", &foo);
    printf("%s", foo);
    free(foo);
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试动态地为字符串分配内存,但正如我之前所说,我的程序只是输出(null).我通过使用getche和realloc创建一个函数来解决这个问题,但是由于我还必须编写如果用户输入退格键,制表符等会发生什么事情,这似乎几乎没有意义.但正如我所说的那只是一个工作周围,​​我宁愿知道为什么上面的代码不起作用......

附加信息:

我正在使用Pelles C IDE v7.00并使用C11标准进行编译

c string input dynamic

6
推荐指数
1
解决办法
1万
查看次数

删除HTTP标头信息

在C中有没有办法recv()在套接字上使用时排除数据附带的HTTP头信息?我试图读取一些二进制数据,我想要的只是实际的二进制信息,而不是HTTP头信息.收到的当前数据如下所示:

HTTP/1.1 200 OK
Content-Length: 3314
Content-Type: image/jpeg
Last-Modified: Tue, 20 Mar 2012 14:51:34 GMT
Accept-Ranges: bytes
ETag: "45da99f1a86cd1:6b9"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Mon, 20 Aug 2012 14:10:08 GMT
Connection: close 

? ?
Run Code Online (Sandbox Code Playgroud)

我只想阅读文件的二进制部分.(这显然不是所有的二进制文件,只是显示了那么多,因为我将recv循环的输出打印为字符串,第一个NULL char在该小二进制字符串之后).

我只需要摆脱标题部分,有一个简单的方法来做到这一点?

c sockets header http

6
推荐指数
2
解决办法
4953
查看次数

如何存储recv()的输出?

在CI有工作代码,但不知道为什么它工作,所以我开始重写它,所以我真的可以理解发生了什么.

到现在为止还挺好!我重写了,并且90%确定我理解现在发生的一切; 但问题是,我不知道如何将recv(databff)收到的数据块存储到我预先分配的缓冲区(htmlbff)中.

考虑下面的代码(请注意,我把它剥离了很多,所以它只包括基础知识,例如没有内存重新分配或泄漏保护等...):

#define BUFFERSIZE 4096
#define MAXDATASIZE 256

char *htmlbff, databff[MAXDATASIZE];
int c, i = BUFFERSIZE, q = 0;          
if(!(htmlbff = malloc(i)))
{
    printf("\nError! Memory allocation failed!");
    return 0x00;
}
while((c = recv(sock, databff, MAXDATASIZE, 0)) > 0)
{
     /*memory checks stripped out since they are irrelevent for this post*/
     /*store data to the appropriate area in htmlbff*/
     q += c;           
}
Run Code Online (Sandbox Code Playgroud)

所以(如果我这样做,事情就像我认为的那样)c是当前数据块的大小,并且q是到目前为止接收的数据总量(每次循环重复时q递增c).目前我正在使用q …

c sockets dynamic recv

6
推荐指数
2
解决办法
2072
查看次数

找到最后一个char出现的最有效方法

考虑一下我快速编写的这个函数来查找字符串中给定char的最后一次出现,并返回它在字符数组中的位置,该字符在物理上是字符串:

size_t strlstchar(const char *str, const char ch)
{
    char *chptr = strrchr(str, ch);
    return chptr - str;
}
Run Code Online (Sandbox Code Playgroud)

我只是在这里快速输入这个(没有编译或任何),因为我对一些事情有疑问.

对我来说,这似乎是找到哪个数组元素保存特定char的最后一个实例的最简单的解决方案,但我不知道它是如何工作的.我刚刚根据strrchr的文档做了这个,所以它在技术上是strrchr完成所有的工作.我无法想象这是实现这一目标的最佳方式(在性能方面),并且希望有人可以提供一些关于最佳方法的信息.

strrchr是一种有效的方法吗?或者strrchr最好留给其他一些用途?

c performance strrchr

5
推荐指数
1
解决办法
8378
查看次数

C中的函数原型

今天早些时候,我正在查看各种头文件,只是为了将它们与我正在制作的文件进行比较,并注意到它们似乎声明它们的功能有点不同.

例如,这里是strlen来自的声明string.h:

extern size_t __cdecl strlen(const char *);

在进行一些研究后,我发现这extern是用于在功能块之外声明变量.最佳做法是在头文件中声明我的函数extern吗?

我看到他们使用的size_tunsigned long long在这里,而不是int,我假设这是因为它由于几个原因(例如字符串的长度永远不会是负数)更有效,但这是他们size_t在这里使用的原因吗?还是我完全忽略了这一点?

最后我看到__cdecl哪些我找不到太多信息.究竟是__cdecl什么?我也应该使用它吗?

最后,我注意到在此声明中,传递的争论没有变量名称strlen.我猜这是因为这不是一个函数原型,只是一个声明,而原型在其他地方.为什么strlen(const char *str)声明中没有变量名称?

我的最后一个问题是,如果这只是一个声明,strlen的函数原型会是什么样子?我的猜测是这样的:

size_t strlen(const char *str)

我只是问,因为我想学习和改进我的代码(假设我在C文件中创建函数原型/声明,然后在头文件中只是函数声明,以便其他C文件可以使用它们).

c header

2
推荐指数
1
解决办法
417
查看次数

计算字符串中字符发生次数的最有效方法

我正在写一个非常简单的函数,它计算某个字符在给定字符串中出现的次数.我有一个工作功能,但想知道是否有更有效或首选的方法来做到这一点.

这是功能:

size_t strchroc(const char *str, const char ch)
{ 
    int c = 0, i = 0;

    while(str[i]) if(str[i++] == ch) c++;
    return c;
}
Run Code Online (Sandbox Code Playgroud)

我个人想不出任何方法来提高这段代码的效率.并且想知道(仅仅为了学习)是否有人知道如何使这个功能更有效.

(在速度和使用最少资源的意义上有效).

c performance character

2
推荐指数
1
解决办法
2417
查看次数

fprintf和NULL终止符

我正在使用fprintf将一个字符串附加到文档,这是我有一个问题的关于:

fprintf(win, bff[i - 2] != '\n' && bff[i - 2] != '\r' ? "\nmultiscreen=1" : "multiscreen=1");
Run Code Online (Sandbox Code Playgroud)

代码有效,它附加multiscreen=1到文件中的下一个可用行.

但是,如果我理解正确,它不会添加一个NULL字符到最后multiscreen=1?这是否重要,因为我将它写入文件并且NULL字符串中的尾部是C的东西?

或者使用fputs而不是更正确fprintf

c string null printf

2
推荐指数
1
解决办法
3674
查看次数

使用头文件的最有效方法是什么

因此,目前在我的编程中,我现在拥有相当大范围的函数,我创建并存储在单独的C文件中,我经常在项目之间使用它们.

我的问题是将其实施到其他项目中的最简单,最有效的方法是什么?目前我只为每个新项目创建一个头文件,其中包含我想要使用的所有自定义函数的函数原型.

然后我让项目中的每个C文件都包含这个"master"标题.在这个头文件中,我还包括每个C文件使用的头文件,因此每个C文件都有一个头文件; 我们打电话吧master.h.

我觉得我这样做完全错了.我应该为每个C文件制作头文件并将它们包含在主头文件中吗?或者我应该只为每个C文件创建头文件并根据需要包含它们?如果我这样做,一切仍然会被联系在一起?

在项目中使用头文件的最佳方法是什么?

c header file

1
推荐指数
1
解决办法
900
查看次数

在给定文件中查找所有子字符串实例

我正在开发一个函数来查找html文件中引用的所有图像,目前我正在尝试在文件中找到这些子字符串:".bmp" ".gif" ".jpg" ".png"并且还想找到它们的根源,例如:/images/foo/然后使用这两个子字符串来创建一个新的string:/images/foo/bar.jpg我知道我将如何连接字符串,但我不知道如何找到实际的子字符串,我现在感到非常不知所措,并且非常感谢一些帮助.

c string substring

1
推荐指数
1
解决办法
99
查看次数

C读取csv文件

我遇到了一个我以前没有遇到过的问题而且感到困惑......出于某种原因,当我尝试通过char读取一个CSV文件char时,似乎空格以某种方式放置在那里......而且更奇怪的是事实上,任何地方都不存在空间字符.我举个例子......

char *readgd(const char *fname)
{
    char *gddata, *tmp;
    FILE *fp;
    int buff = 1024, c = 0, ch;

    if(!(fp = fopen(fname, "r")))
    {
        printf("\nError! Could not open %s!", fname);
        return 0x00;
    }
    if(!(gddata = malloc(buff)))
    {
        fclose(fp);
        printf("\nError! Memory allocation failed!");
        return 0x00;
    }
    while(ch != EOF)
    {
        c++;
        ch = fgetc(fp);
        if(buff <= c)
        {
            buff += buff;
            if(!(tmp = realloc(gddata, buff)))
            {
                free(gddata);
                fclose(fp);
                printf("\nError! Memory allocation failed!");
            }
            gddata = tmp;
        }
        gddata[c - 1] = …
Run Code Online (Sandbox Code Playgroud)

c csv parsing

1
推荐指数
1
解决办法
1455
查看次数

C正确使用免费

我相信我这样做是对的,但我想确定一下.在一个程序中,我使用两个指针指向由函数返回的已分配内存.当我完成使用那个内存free()时,我会使用那些相同的指针来指向新分配的内存空间.这是我的程序,给出一个我的意思的例子(评论显示我的思考过程):

int main(void)
{
    char *data, *url;
        int i = 1;

    while(i)
    {
        printf("Enter URL: ");
        if(!(url = getstr())) return 1;                                  //url now points to allocated memory from getstr();
        if(strlen(url) <= 0) i = 0;
        if(data = readsocket(url, 80, "http")) printf("\n%s\n\n", data); //data now points to allocated memory from readsocket();
        else printf("\n\n");
        free(url);                                                       //free allocated memory that url points to url
        free(data);                                                      //free allocated memory that data points to data
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是正确的,还是有更好的更普遍的优先方法呢?或者我只是完全做错了?

c memory free

1
推荐指数
1
解决办法
254
查看次数

奇怪的字符串行为

我正在尝试验证用户输入的URL是否为所需格式,在这种情况下,我试图删除http://它是否存在但我遇到了一些非常奇怪的问题...

如果我提供功能" www.google.com"或" http://www.google.com"一切按预期进行!但是,如果我给它提供的东西不是有效的URL(例如马铃薯),它会返回位于内存中的乱码...

为什么这不是一个问题,它肯定不是预期的程序行为,我不知道它为什么会这样做...

Enter URL: potato

Error! Could not resolve ip address for host: ??ï*** Process returned 1 ***
Press any key to continue...
Run Code Online (Sandbox Code Playgroud)

这是有问题的功能:

char *bldurl(const char *url)
{
    char *nurl;
    int ch = 0, i = 0;

    if(chksbstr(url, "http://") < 0)
    {
        if(!(nurl = malloc(strln(url) + 8)))
        {
            printf("\nError! Memory allocation failed while appending URL!");
            return 0x00;
        }
        nurl[ch] = 'h';
        nurl[++ch] = 't';
        nurl[++ch] = 't';
        nurl[++ch] = 'p';
        nurl[++ch] = …
Run Code Online (Sandbox Code Playgroud)

c sockets resolve

0
推荐指数
1
解决办法
109
查看次数

标签 统计

c ×13

dynamic ×3

header ×3

sockets ×3

string ×3

performance ×2

arrays ×1

character ×1

csv ×1

file ×1

free ×1

function ×1

http ×1

input ×1

memory ×1

null ×1

parsing ×1

printf ×1

recv ×1

resolve ×1

return ×1

strrchr ×1

substring ×1