您是否必须手动循环遍历数组并获取每个字符数组的strlen计数,求和,使用求和值分配目标,然后再次循环数组?
如何找到包含字符数组的数组的大小,以便迭代它们?
当我使用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++非常混乱.请帮我.
我有一个常量定义:
#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中对表达式进行字符串化
我希望我能在这里找到解决问题的方法.
我想添加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) 我有一个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)
为什么它不起作用,我怎样才能使它工作?(我显然可以在构造函数中遍历数组,但是如果可能的话我想使用初始化列表,并且我想了解它为什么在一个编译器中工作,而不是另一个编译器.)
我写了一个创建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 ++ 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) 好的,所以我正在尝试制作一个允许用户输入电子邮件的程序.如果符合两项规定,他们的电子邮件将被视为有效: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) 我知道%%用于转义%字符串中的实际符号,因此%%%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) 在阅读有关打印字符串的过程中,我通过一个声明" 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)