标签: c-strings

char数组与char指针

当使用recv通过套接字接收数据时,我注意到了:

char buffer[4];
memset(buffer, 0, 4);
recv(socket, buffer, 4, 0);

我收到

mesgx

"mesg"是我发送的内容,附加了一些随机字符.

如果我使用

char * method = (char *) malloc(4);
memset(buffer, 0, 4);
recv(socket, buffer, 4, 0);

相反,我收到了

MESG

所以我的字符串中没有附加的随机内容.我想出如果我使用char [5]而不是它也可以,但我真的不明白为什么.malloc(4)真的分配了5个字节,第五个是NUL吗?

c malloc c-strings memset

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

为什么我不能在char*中编辑char?

下面是一个非常简单的例子.它在Mac OS X(Snow Leopard)上使用gcc编译得很好.在运行时它输出总线错误:10.这里发生了什么?

char* a = "abc";
a[0] = 'c';
Run Code Online (Sandbox Code Playgroud)

c gcc c-strings

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

C字符串与等号的比较

我有这个代码:

char *name = "George"

if(name == "George")
   printf("It's George")
Run Code Online (Sandbox Code Playgroud)

我认为c字符串无法与==sign 进行比较,我必须使用strcmp.由于未知原因,当我使用gcc(版本4.7.3)编译时,此代码有效.我认为这是错误的,因为它就像比较指针,所以我在谷歌搜索,很多人说这是错误的,比较==不能做.那么为什么这种比较方法有效?

c string c-strings

6
推荐指数
3
解决办法
954
查看次数

将数组中的字符附加到字符指针

好的,所以我是一个通常会编写 Java/C++ 的人,而且我刚刚开始编写 C。我目前正在编写一个词法分析器,我无法忍受字符串在 C 中的工作方式,因为我可以'不执行字符串算术。所以这是我的问题:

char* buffer = "";
char* line = "hello, world";

int i;
for (i = 0; i < strlen(line); i++) {
    buffer += line[i];
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 C 中做到这一点?由于上面的代码不是有效的 C,我该怎么做呢?基本上我在循环一个 string line,并且我试图将每个字符附加到bufferstring 。

c c-strings string-literals

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

如何从C字符串中删除"垃圾输入"?

我试图写一个函数,将一个数组中删除所有字符,除了'+','-','*','/',和数字.这是我提出的代码:

void eliminateJunk(char string[MAX]){
    int i,j;
    char stringOut[MAX];
    int length = strlen(string) - 1;

    for(i=0; i <= length; i++){
        if(string[i] != '+'
        && string[i] != '-'
        && string[i] != '*'
        && string[i] != '/'
        && !(isdigit(string[i]))){
            for(j=i; j < length; j++){
                string[j] = string[j+1];
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,该函数并不总是从c字符串中删除所有垃圾字符 - 它会获得大部分垃圾字符,但偶尔会留下一些.

输入示例:

123 123
Run Code Online (Sandbox Code Playgroud)

数组的示例输出,在修改后:

123123
Run Code Online (Sandbox Code Playgroud)

但是,在某些输入中,它会留下空间......

输入示例:

123   123
Run Code Online (Sandbox Code Playgroud)

示例输出:

123 123
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能解决这个问题?我觉得解决方案就在我的鼻子底下,但我似乎无法找到它.

c c-strings character-arrays

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

不允许从'const char*'到'void*'的static_cast

在C++中,我正在尝试打印C字符串的地址但是我的演员似乎有些问题.我从一本书中复制了代码,但它不能在我的mac上编译.

const char *const word = "hello";
cout << word << endl; // Prints "hello"
cout << static_cast< void * >(word) << endl;  // Prints address of word
Run Code Online (Sandbox Code Playgroud)

c++ casting c-strings

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

在指针类型的方法上使用大小模板的首选方法

当重载方法时,我相信当多个匹配可用时,编译器将选择更简单的匹配.

考虑以下代码:

#include <iostream>
#include <string>

struct  A {
    static void foo(const char *str) {
        std::cout << "1: " << str  << std::endl;
    }

    template<int N>  static void foo(const char (&str)[N]) {
        std::cout << "2: " << str  << std::endl;
    }
};

int main()
{
    A::foo("hello");
}
Run Code Online (Sandbox Code Playgroud)

输出是1: hello.然而,如果我注释掉这个static void foo(const char *str)方法,它会编译精细和输出2: hello.

如何在类上同时使用这两种方法,使得已知大小的数组将调用模板方法,而指针类型调用非模板方法?

我尝试了以下方法:

struct  A {
    template<class _Ty = char>
    static void foo(const _Ty *str) {
        std::cout << "1: " << …
Run Code Online (Sandbox Code Playgroud)

c++ arrays overloading c-strings c++11

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

C字符串编码Windows/Linux

如果我获取包含7位ASCII表之外的字符的字符串的长度,我会在Windows和Linux上得到不同的结果:

Windows: strlen("ö") = 1
Linux:   strlen("ö") = 2
Run Code Online (Sandbox Code Playgroud)

在Windows机器上,字符串显然以"扩展"ascii格式编码0xF6,而在Linux机器上,它以UTF-8编码0xC3 0x96,其长度为2个字符.

题:

为什么C字符串在Windows和Linux机器上的编码方式不同?


我在与Code Review的论坛成员讨论时提出了这个问题(参见本主题).

c c-strings

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

为什么此非空终止的字符串正确打印

昨天,我进行了单元测试。程序之一是复制字符串并找出没有字符串功能的长度。这是我写的代码:

#include <stdio.h>

int main(){
    char str1[100], str2[100] = {'a'};

    printf("Enter a string\n");
    fgets(str1, sizeof(str1), stdin);

    int i;
    for(i = 0; str1[i] != '\0'; i++){
        str2[i] = str1[i];
    }   

    str2[i] = '\0';

    printf("Copied string = %s", str2);

    printf("Length of string = %d", i-1);
}
Run Code Online (Sandbox Code Playgroud)

我有一个相当令人惊讶的观察!即使添加了注释str2[i] = '\0',该字符串也将正确打印,即,'a'在初始化中没有多余的,据我所知,不应将其覆盖。

评论后str2[i] = '\0',我希望看到以下输出:

test
Copied string = testaaaaaaaaaaaaaaaaaaaaaaaaaaa....
Length of string = 4
Run Code Online (Sandbox Code Playgroud)

这是输出:

test
Copied string = test
Length of string = 4
Run Code Online (Sandbox Code Playgroud)

如何str2正确打印?编译器可以识别字符串的复制并静默添加空终止符吗?我正在使用gcc,但是clang也会产生类似的输出。

c string initialization c-strings

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

如何检查 MFC CString 是否为空?

我想检查 MFC CString 是否为空。有没有办法做到这一点?

PS:我想检查它是否为空,而不是它是否为空。

CString m_strName;

在此处输入图片说明

c++ mfc c-strings visual-c++

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