标签: c-strings

你如何在c中迭代一组字符数组?

您是否必须手动循环遍历数组并获取每个字符数组的strlen计数,求和,使用求和值分配目标,然后再次循环数组?

如何找到包含字符数组的数组的大小,以便迭代它们?

c c-strings

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

我糊涂了!C++中的Char,Char*或String

当我使用char或char*时,visual studio 2012(11)只会播放最后一个字符,例如:

#include <iostream>
#include <string>
int main(){
 using namespace std;
 char chName = 'Alex'; 
 cout<<chName;
}
Run Code Online (Sandbox Code Playgroud)

它只显示"x".它是正确的是我使用 string strName = "Alex" 但在那些有参数作为char的函数中,字符串不能作为参数传递.在这种情况下,VS编译器说字符串不能转换为int.还告诉我char和char*之间有什么区别.我是一名PHP开发人员,C++非常混乱.请帮我.

c++ c-strings

5
推荐指数
2
解决办法
3621
查看次数

将#defined常数转换为字符串

我有一个常量定义:

#define MAX_STR_LEN 100
Run Code Online (Sandbox Code Playgroud)

我想这样做:

scanf("%" MAX_STR_LEN "s", p_buf);
Run Code Online (Sandbox Code Playgroud)

但当然这不起作用.

可以使用什么预处理器技巧将MAX_STR_LEN数字转换为字符串,以便我可以在上面的scanf调用中使用它?基本上:

scanf("%" XYZ(MAX_STR_LEN) "s", p_buf);
Run Code Online (Sandbox Code Playgroud)

XYZ()应该是什么?

注意:我当然可以直接做"%100s",但这样做会失败.我也可以#define MAX_STR_LEN_STR"100",但我希望有一个更优雅的解决方案.

c macros c-strings stringification c-preprocessor

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

如何在C语言中使用字符串化在预处理器中执行计算

可能重复:
如何在C中对表达式进行字符串化

我希望我能在这里找到解决问题的方法.

我想添加ADD1中定义的十六进制数字,并且需要以*str字符串形式输入相同的数字.

这只是一个例子,首先证明它的可能性.我实际上是在头文件中做同样的事情.

#include <stdio.h>


#define XMK_STR(x)      #x
#define MK_STR(x)       XMK_STR(x)
#define ADD1 0x6000+0x10

main()
{
        char *str = "START " MK_STR(ADD1) "\n";
        printf(str);
}
Run Code Online (Sandbox Code Playgroud)

c c-strings stringification c-preprocessor

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

如何从字符串文字初始化unsigned char数组?

我有一个unsigned char[16]字段的结构,我想初始化为零.以下(强烈简化的)代码使用clang(OS X)编译良好:

struct GUID {
    unsigned char bytes[16];
    GUID() : bytes("\0\0\0\0""\0\0\0\0""\0\0\0\0""\0\0\0") {};
}
Run Code Online (Sandbox Code Playgroud)

注意我使用15 \0秒,因为16th是字符串文字的零终止符,如果你初始化一个字节太多的字符串,clang会抱怨.

现在,当我尝试使用GCC 4.5.3(cygwin)进行编译时,我得到:

error: incompatible types in assignment of 'const char [16]' to 'unsigned char [16]'
Run Code Online (Sandbox Code Playgroud)

为什么它不起作用,我怎样才能使它工作?(我显然可以在构造函数中遍历数组,但是如果可能的话我想使用初始化列表,并且我想了解它为什么在一个编译器中工作,而不是另一个编译器.)

c++ c-strings

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

在Windows XP下崩溃CAtlStringMgr :: GetInstance

我写了一个创建ATL CString对象的DLL.我使用Visual Studio 2015使用"Visual Studio 2015 - Windows XP(v140_xp)"平台工具集编译它.使用LoadLibrary/GetProcAddress加载DLL.

在分配字符串对象时,它在CAtlStringMrg :: GetInstance中的Windows XP下崩溃.相同的应用程序在Windows Vista及更高版本上运行良好.

这是反汇编:

    static IAtlStringMgr* GetInstance()
    {
#pragma warning(push)
#pragma warning(disable: 4640)
        static CWin32Heap strHeap( ::GetProcessHeap() );
1003B100 mov         eax,dword ptr fs:[0000002Ch] 
1003B106 mov         ecx,dword ptr [__tls_index (101B46C8h)] 
1003B10C push        esi 

*** This is the instruction that causes the crash. eax and ecx are zero. ***
1003B10D mov         esi,dword ptr [eax+ecx*4]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,代码引用了__tls_index,因此它使用了线程本地存储.dumpbin还显示了一个.tls部分,当我使用旧的Visual Studio 2013编译项目时,该部分不存在.

动态加载DLL时,Windows XP不支持线程本地存储.这解释了为什么上面的代码崩溃了.

但是,我无法弄清楚为什么使用线程本地存储.我在ATL源中找不到__declspec(thread).

我正在寻找修复/解决方法(除了从VS2015回到VS2013).

该问题已经报告给微软,但他们还没有评论/修复它:https://connect.microsoft.com/VisualStudio/feedback/details/1635157/crash-in-catlstringmrg-getinstance-under-windows-xp

c++ windows-xp atl visual-studio-2005 c-strings

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

c ++一次读入一个c字样的字符串?

在c ++ id中,喜欢一次将一个字符读入一个c样式的字符串.如何在不首先创建具有设置大小的字符数组的情况下执行此操作(您不知道用户将输入多少个字符).既然你无法调整数组的大小,那怎么办呢?我正在考虑这些问题,但这不起作用.

char words[1];
int count = 0;

char c;
while(cin.get(c))
{
    words[count] = c;
    char temp[count+1];
    count++;
    words = temp;
    delete[] temp;
}
Run Code Online (Sandbox Code Playgroud)

c c++ c-strings cin

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

用C++进行电子邮件验证

好的,所以我正在尝试制作一个允许用户输入电子邮件的程序.如果符合两项规定,他们的电子邮件将被视为有效:A.那里必须有某个"@"符号和B."@"之后必须有一段时间.我在大多数情况下都得到了代码,但是在验证具有"@"符号前一段时间的电子邮件时遇到了一些困难.如果他们在"@"符号之前有一段时间,那么他们就被视为有效,但他们不应该这样.例如,输入text.example@randomcom被认为是有效的.

任何人都可以帮我弄清楚我做错了什么?先感谢您!

#include <iostream>
#include <cctype>
#include <cstring>
using namespace std;

int main()
{
    int x = 25; //random size enough to hold contents of array plus one for               null terminator
    char input[x]; //array to hold input
    int sizeOf; //holds length of input array
    char* ptr = nullptr; //pointer
    char* ptr2 = nullptr; //pointer

    cout << "Enter your email address\n";
    cin.getline(input,x);
    sizeOf = strlen(input);

    for(int i = 0; i < sizeOf; i++)
    {
        ptr= strstr(input, "@"); //searches input …
Run Code Online (Sandbox Code Playgroud)

c++ email validation c-strings

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

格式化多个百分号的字符串

我知道%%用于转义%字符串中的实际符号,因此%%%ds将以%10s下面的格式字符串结束,但我不知道为什么我需要%%5s在这个字符串中?

毕竟,只有两个额外的参数(BUFFSIZE/10).

#define BUFFSIZE 100
char buf[100]={0}
sprintf(buf, "%%5s %%%ds %%%ds", BUFFSIZE / 10, BUFFSIZE / 10);
Run Code Online (Sandbox Code Playgroud)

运行上面的代码后,buf将包含字符串,

%10s %10s 
Run Code Online (Sandbox Code Playgroud)

c printf c-strings string-formatting

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

在C中打印字符串和空字符的概念

在阅读有关打印字符串的过程中,我通过一个声明" printf逐个写入字符,直到它遇到一个空字符.如果缺少空字符,则printf继续超过字符串的结尾,直到最终它在字符串中找到一个空字符.记忆".所以我写了一些代码:

情况1:

char arr[4] = { 'a', 'b', 'c' } ;

if (arr[3]== '\0')

printf ("%s",arr);
Run Code Online (Sandbox Code Playgroud)

输出是abc.

这是否意味着编译器已自动存储'\0'arr[3].因为根据声明,printf只会在遇到时终止'\0'.

案例2:

char arr[3] = { 'a', 'b', 'c' } ;

if (arr[3]== '\0')

printf ("%s",arr);
Run Code Online (Sandbox Code Playgroud)

abc尽管没有数组块arr[3]存在,但输出又是 ,所以为什么不是错误呢?printf也已打印abc并停止,这意味着它必须遇到'\0'.那么这意味着编译器在arr[2]存储后会创建一个额外的数组块'\0'.如果这样那么数组大小必须增加到4个字节(每个字符类型字符为1个字节).但是执行语句printf ("%d",sizeof (arr));会给出输出3,表明数组大小没有增加,表明没有arr[3].那条件怎么if (arr[3]== '\0')变成了真的呢?

案例3:

char arr[3] = "abc";

if (arr[3]== '\0') …
Run Code Online (Sandbox Code Playgroud)

c arrays string initialization c-strings

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