strtol概念上,规范将输入字符串分为"初始空格","主题序列"和"最终字符串",并将"主题序列"定义为:
输入字符串的最长初始子序列,从第一个具有预期形式的非空白字符开始.如果输入字符串为空或完全由空格字符组成,或者第一个非空白字符不是符号或允许的字母或数字,则主题序列不应包含任何字符.
有一次,我认为"最长的初始子序列"业务类似于scanf工作方式,在哪里"0x@"扫描"0x",失败的匹配,然后"@"作为下一个未读的角色.然而,在经过一些讨论之后,我基本上确信strtol处理了预期形式的最长初始子序列,而不是最长的初始字符串,它是预期形式的某些可能字符串的初始子序列.
令我困惑的是规范中的这种语言:
如果主题序列为空或者没有预期的形式,则不进行转换; str的值存储在endptr指向的对象中,前提是endptr不是空指针.
如果我们接受似乎是"主题序列"的正确定义,那么就没有不具有预期形式的非空主题序列,而是(为了避免冗余和混淆)文本应该只读:
如果主题序列为空,则不执行转换; str的值存储在endptr指向的对象中,前提是endptr不是空指针.
谁能为我澄清这些问题?也许与过去的讨论或任何相关缺陷报告的链接将是有用的.
此代码似乎按预期工作,使用单个指针填充数字数组
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
int main(void)
{
int arr[4], count = 0, i;
char *p, s[32] = " \t 10, 15 \n ,20, 25 , ";
p = s;
do {
arr[count++] = (int)strtol(p, &p, 10);
while (isspace(*p) || *p == ',') p++;
} while (*p);
for (i = 0; i < count; i++) {
printf("%d\n", arr[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
在strtol中使用p作为param1(source)和&p作为param 2(第一个无效字符的地址)是有效的吗?
这是如何strtol根据§ 7.22.1.4C11(n1570)声明:
#include <stdlib.h>
long int strtol (const char *restrict nptr,
char **restrict endptr,
int base);
Run Code Online (Sandbox Code Playgroud)
据我所知,restrict关键字意味着左边界引用的对象*nptr只能使用它或直接从中获取的值.
但是,许多程序员,甚至是经验丰富的程序员,都strtol以下列方式使用:
#include <stdlib.h>
strtol (p, &p, 10);
Run Code Online (Sandbox Code Playgroud)
在那种情况下,**endptr == **&p == *p == *nptr行为是未定义的.这样对吗?
我strtol在c中遇到了一些无法解释的结果
这是示例程序.
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%x\n", strtol("0xfffff70A", NULL, 0));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个简单程序的输出是
0x7fffffff
Run Code Online (Sandbox Code Playgroud)
而不是0xfffff70A.如果我使用strtoul,结果是完全正确的0xfffff70a.我使用的是32位机器,我想知道会发生什么.PS.我正在使用gcc 4.7.2
以下是 C 标准库例程的原型strtol:
long int strtol(const char* str, char** endptr, int base);
Run Code Online (Sandbox Code Playgroud)
典型用法:
const char* str = "123a";
char* endptr;
long int value = strtol(str, &endptr, 10);
if (*endptr)
// Do something
else
// Do something else
Run Code Online (Sandbox Code Playgroud)
为什么要这样做呢?为什么不传递局部变量的地址?
例子:
long int strtol(const char* str, char* endptr, int base);
Run Code Online (Sandbox Code Playgroud)
用法:
const char* str = "123a";
char end;
long int value = strtol(str, &end, 10);
if (end)
// Do something
else
// Do something else
Run Code Online (Sandbox Code Playgroud)
我确信这个设计决定有一个合乎逻辑的原因,但我不太明白。
我可以使用该strtol函数将基于 base36 的值(另存为字符串)转换为long int:
long int val = strtol("ABCZX123", 0, 36);
Run Code Online (Sandbox Code Playgroud)
是否有标准函数允许反转它?也就是把一个long intval变量转换成base36字符串,再获取"ABCZX123"?
我正在使用stdlib库中的strtol()进行一些证明,因为我有一个总是崩溃的程序,我发现这完美地运行了:
main(){
char linea[]="0x123456",**ap;
int num;
num=strtol(linea,ap,0);
printf("%d\n%s",num,*ap);
}
Run Code Online (Sandbox Code Playgroud)
但是当我添加一个新的声明时,无论它在哪里崩溃
main(){
char linea[]="0x123456",**ap;
int num;
num=strtol(linea,ap,0);
printf("%d\n%s",num,*ap);
int k;
}
Run Code Online (Sandbox Code Playgroud)
只是添加最后的"int k;" 程序在执行strtol()时崩溃无法理解原因.我在Code :: Blocks上这样做
我的目标是一个字符串转换,如"A1234"为long同值1234.我的第一步是转换"1234"为a long,并按预期工作:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char* test = "1234";
long val = strtol(test,NULL,10);
char output[20];
sprintf(output,"Value: %Ld",val);
printf("%s\r\n",output);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我遇到指针问题并试图忽略A字符串的开头.char* test = "A1234"; long val = strtol(test[1],NULL,10);然而,我已经尝试过崩溃程序.
如何正确设置它以使其指向正确的位置?
我正在编写要在UNIX上运行的ac程序,并尝试使用chmod命令.在查阅了手册页后,我知道chmod需要两个参数.第一个是权限位,第二个是要更改的文件.我想采用文件当前权限位和用户输入的位的按位OR,并将其提供给chmod()以更改文件的权限.
我找到了这个access()函数,但是我很难弄清楚如何使用它来获取指定文件的权限位.
我现在拥有的是:
octalPermissionString = strtol(argv[1], (char**)NULL, 8);
if(chmod(argv[2], octalPermissionString | (access(argv[2], octalPermissionString)) < 0) {
fprintf(stderr, "Permissions of file %s were not changed.\n");
}
Run Code Online (Sandbox Code Playgroud)
哪里:
argv [1]包含一个由用户输入的三位十进制数的字符串,用于转换为八进制,然后用作按位OR的权限位,
argv [2]是允许更改权限的文件,也是由用户指定的.
octalPermissionString是一个long来保存用户输入的八进制转换.
是/是否有任何其他函数可以返回给定文件的权限位?
编辑:缺少右括号
在大学时,我被问到我们的程序是否检测到从命令行参数输入的字符串是否是一个它没有(./Program 3.7)的整数.现在我想知道我怎么能发现这个.因此,例如输入a无效,其中atoi检测到,但是例如输入3.6应该是无效的但是atoi将其转换为整数.
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc > 1) {
int number = atoi(argv[1]);
printf("okay\n");
}
}
Run Code Online (Sandbox Code Playgroud)
但是只有当argv [1]真的是一个整数时才应该打印出来.希望我的问题很明确.非常感谢.
c ×10
strtol ×10
pointers ×2
std ×2
base64 ×1
integer ×1
permissions ×1
string ×1
unix ×1
validation ×1