我正在尝试编写一个从字符串中打印两个数字的程序。
例如,string = '20,66'我试图将此字符串分开,以便将'20'和'66'存储到两个单独的变量中。
以下是我正在处理的代码:
#include <stdio.h>
char line[80];
int main(void)
{
// Variables
int start_number, end_number;
int i, j;
while(1)
{
printf("Enter a number: ");
fgets( line, sizeof(line), stdin);
// How to find Comma
for( i=0; i < strlen(line); i++)
{
if(line[i]==',') break;
}
// How to find two numbers
for(j = 0; j < i; j++)
{
printf("1: %c\n", line[j]);
}
for(j = i + 1; j < strlen(line); j++)
{
printf("2: %c\n", line[j]);
}
if (strcmp(line, "quit\n") == 0)
{
printf("Now terminating program...");
break;
}
}
}
到目前为止,我只能存储单个数字变量,并且由于某种原因打印了一个额外的行。
任何建议或意见将不胜感激。
答案 0 :(得分:4)
非常简单:
const char *text = "20,30";
const char *rest = 0;
int first = strtol(text, &rest, 10); // input, pointer to remaining string, base (10 = decimal)
rest += 1; // skip the comma; this is error prone in case there are spaces!
int second = strtol(rest, NULL, 10); // not interested in remaining string, so pass NULL this time
答案 1 :(得分:2)
众多方法之一:找到逗号后,您可以将逗号更改为(char)0
。然后你会有两个字符串,一个是line
,另一个是line+comma_offset+1
。两者都只是数字,可以传递给atoi
。
这个技巧起作用的原因是C字符串的实现方式 - 字符串的结尾是0.所以,你拿一个字符串:
'1' '2' ',' '3' '4' 0x00
|
line
并将逗号替换为null:
'1' '2' 0x00 '3' '4' 0x00
| |
line str_2
然后你有两个C字符串。这就是strtok
和strtok_r
的工作方式。
答案 2 :(得分:2)
了解scanf及其亲属:
#include <stdio.h>
int main() {
int x, y;
sscanf("22,33", "%d,%d", &x, &y);
printf("Scanned vars: %i %i\n", x, y);
}
tmp]$ ./a.out
Scanned vars: 22 33
可能会引入安全漏洞,因此请务必阅读并理解security上的部分,以便为您尝试扫描的值提供足够的存储空间。
答案 3 :(得分:0)
也许你不想在for循环中打印“1:”和/或NEWLINE(“\ n”)。改变这个:
for(j = 0; j < i; j++)
{
printf("1: %c\n", line[j]);
}
到此:
printf("1: ");
for(j = 0; j < i; j++)
{
printf("%c", line[j]);
}
printf("\n");
答案 4 :(得分:0)
#include <stdio.h>
char line[80];
int main(void)
{
// Variables
int start_number, end_number;
int i, j;
while(1)
{
printf("Enter a number: ");
fgets( line, sizeof(line), stdin);
for( i=0; i < strlen(line); i++)
{
char num[];
if(line[i]!=','){
num[j++] = line[i];
}
else{
for(int x =0 x<strlen(num); x++)
printf("Number :%c", num[x]);
j=0;
}
}
}
}